Вот мой код. Это кажется простым, но почему-то это просто не работает.
Последний вызов функции всегда завершается ошибкой доступа.
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, и все, кажется, в порядке.