我有一个 DLL (WinDll.dll),它导出一个名为“SampleFunction”的函数。该 DLL 与正在执行的应用程序位于同一文件夹中。现在,当我尝试按名称获取导出函数的地址时,它会给出错误
127
,但是,当我使用函数的序数值执行相同操作时,它工作得很好。任何想法如何以及为什么会发生这种情况?以下是加载并尝试使用导出函数的代码。我还附上了 IDA Proo 的一个剪辑,其中显示了 WindDll.dll 导出的函数。
#include <windows.h>
#include <stdio.h>
typedef int (WINAPI *ProcP)(HINSTANCE, HINSTANCE, LPSTR, int);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HINSTANCE hinstlib;
LPSTR lpBuffer = (LPSTR)malloc(256*2);
GetCurrentDirectory(256,lpBuffer);
ProcP procAddress = NULL;
strcat(lpBuffer,"\\WinDll.dll");
hinstlib = LoadLibrary(TEXT(lpBuffer));
if(hinstlib == NULL){
MessageBox(NULL,lpBuffer, "Bull", MB_OK);
exit(0);
}
else{
procAddress = (ProcP)GetProcAddress(hinstlib,"SampleFunction"); // <-- Problem
if(procAddress != NULL){
PostMessage(NULL, WM_RBUTTONDOWN, MK_RBUTTON, 0);
}
else{
MessageBox(NULL, "Invalid ProcAddress", "Bull", MB_OK);
}
}
return 0;
}
SampleFunction()
似乎是用 _stdcall
调用约定声明的。因此,您必须传递给 GetProcAddress()
的函数名称是 _SampleFunction@16
,如 dumpbin
命令所示。
有关调用约定的更多详细信息,请搜索“stdcall”、“cdecl”和“调用约定”。