Постоянная ошибка доступа при вызове функции, возвращаемой 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)();
Другие вопросы по тегам