Несмотря на то, что в заголовке написано 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, но никаких изменений не заметил.