Постоянная ошибка доступа при вызове функции, возвращаемой GetProcAddress
Вот мой код Это кажется простым, но почему-то это просто не работает. Последний вызов функции всегда завершается ошибкой доступа.
extern "C"
{
typedef const char* (*Init_fptr_t)();
HMODULE CMolNet::LoadDLL()
{
string dir = "C:\\MyDllDir\\";
CA2W dirw( dir.c_str() );
SetDllDirectory(dirw);
string dllfile = CombinePath(dir.c_str(), "mydll.dll");
CA2W dllfilew( dllfile.c_str() );
mDLL = LoadLibraryEx(dllfilew,0,LOAD_WITH_ALTERED_SEARCH_PATH);
DWORD err = GetLastError();
Init_fptr_t iFunc = (Init_fptr_t)GetProcAddress(mDLL,"Init");
const char *res = (*iFunc)();
}
}
mydll.dll является сторонним dll. У меня нет исходного кода, но прототип функции в заголовке выглядит следующим образом:
extern "C" {
const char* Init();
}
Сам файл mydll.dll зависит от нескольких других библиотек, хранящихся в каталоге "C:\MyDllDir", отсюда и вызов SetDllDirectory.
Некоторые наблюдения:
- Я не мог заставить работать ванильный LoadLibrary, но
LoadLibraryEx
с аргументами должно было работать (в томGetLastError
возвращается0
) - Адрес dll возвращается кажется странным (
0x43900000
) - Адрес функции, возвращаемой
GetProcAddress
тоже странно (0x43902b34
), но уверенно DLL Export Viewer сообщает, что функция Init имеет смещение0x00002b34
) - Вызов возвращенной функции всегда приводит к ошибкам доступа. Я перепробовал каждую комбинацию
_ccdecl
,__stdcall
и т. д. наtypedef
для функции, но всегда получаю ту же ошибку. Я пытался с и безextern C
Другие данные:
- Этот кусок кода C++ вызывается из управляемой среды
- Я работаю на Windows 7, 64 бит, но компилирую неуправляемую часть как win32
Что я делаю неправильно? Как я могу отладить это? Я пробовал ходок зависимости и просмотрщик экспорта dll, и все, кажется, хорошо.
1 ответ
Все отлично. Вам просто не нужно использовать *
когда вы вызываете функцию через указатель. Назовите это как обычную функцию:
const char *res = iFunc();
вместо
const char *res = (*iFunc)();