GetProcAddress не работает для функций, кроме void - PullRequest
1 голос
/ 01 июля 2011

У меня проблема с GetProcAddress: Я написал простую DLL с одной функцией:

extern "C" LRESULT WINAPI Function(HWND Hwnd, UINT Message,
                                   WPARAM wParam, LPARAM lParam)
{
    Beep(1000, 1000);
    return CallNextHookEx(0, Message, wParam, lParam);
}

Когда я пытаюсь получить адрес функции, GetProcAddress завершается ошибкой с кодом ошибки 127 (ERROR_PROC_NOT_FOUND). Однако, если я использую void в качестве типа функции, он работает отлично. Я не могу понять, почему он так себя ведет. Любые предложения будут с благодарностью!

Кстати: DependencyWalker показывает, что имя функции действительно "Function", изменения не применены.

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

В GetProcAddress есть только два режима отказа:

  • вы не экспортировали функцию
  • вы не правильно поняли имя

Имя экспортированной этой функции не является «функцией», если вы не использовали файл .def для переименования экспорта или не создали 64-битную DLL. Это будет "_Function @ 16" для 32-битной сборки. Постфикс @ 16 будет тесно связан с тем, что у вас возникают проблемы с его работой для функций с любыми аргументами.

В командной строке Visual Studio запустите Dumpbin.exe / exports в вашей DLL, чтобы увидеть экспорт. Удалите файл .pdb в том же каталоге, если он есть.

2 голосов
/ 10 сентября 2012

Рекомендуется использовать определение модуля (файл .def) с именами экспортируемых функций вместо __declspec (dllexport).Управлять ими гораздо проще.

Также это

#define DllExport extern "C" __declspec (dllexport)

приводит к тому, что экспортируемые имена функций dll не имеют каких-либо "++" украшений c ++

...