Неопределенное поведение при вызове функции из dll - PullRequest
1 голос
/ 29 мая 2020

Несмотря на то, что в заголовке написано dll, фактически загруженная библиотека - exe. Допустим, у меня есть exe-файл testlib.exe. Мне нужно вызвать из него функцию, пусть будет func(). Вот что я делаю:

#include <windows.h>
#include <stdio.h>

typedef char* (__stdcall *f_func)();

int main()
{
  HINSTANCE hGetProcIDDLL = LoadLibrary("testlib.exe");
  f_func func = (f_func)GetProcAddress(hGetProcIDDLL, "func");

  printf(func());

  return 0;
}

Сейчас в большинстве случаев, когда я запускаю программу, она дает правильный результат, но в некоторых случаях (например, 1 из 8) выдает либо мусорный текст, либо значения некоторые другие переменные в testlib.exe. Я определяю это из-за неправильной ссылки на память, но не могу ни объяснить, ни решить.

Моя ОС - windows, и я использую mingw g cc. Я не использую MSVS, поскольку он не подходит для переносимости кода.

PS: testlib.exe хорошо построен, и я не могу его изменить. Вряд ли возникнут проблемы. Я пробовал разные версии, и он также хорошо работает в других системах сборки. Также это релизная сборка, поэтому меньше надежд на отладку.

ОБНОВЛЕНИЕ: Я видел этот вопрос, в нем говорится, что это возможно путем исправления IAT стол. Моя точка зрения совершенно другая. Я использую функцию, которая не инициализируется ни main, ни dllmain. На самом деле я обнаружил, что GetProcAddress каждый раз дает правильный указатель на функцию. Что портится, так это возвращаемый объект. Например, если функция в библиотеке exe:

const char* func() {
    return "Sometext";
}

, то иногда ссылка на "sometext бывает неправильной. Я подозреваю случайную загрузку, но не уверен. Я переименовал exe в dll, но никаких изменений не заметил.

...