Постоянная ошибка доступа при вызове функции, возвращаемой GetProcAddress - PullRequest
0 голосов
/ 02 апреля 2011

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

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 Ответ

1 голос
/ 04 июня 2011

Все хорошо.Вам просто не нужно использовать * при вызове функции через указатель.Вызывайте это как обычную функцию:

const char *res = iFunc();

вместо

const char *res = (*iFunc)();
...