代码:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
当我在挂钩之前正常调用MessageBoxA时,挂钩部分工作正常。但是,当我删除那部分而只留下“挂钩”部分时,它失败了......
解决:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
LoadLibraryA("User32.dll");
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
答案 0 :(得分:3)
如此处所示,该进程没有理由加载user32.dll
。因此,对GetModuleHandle
的调用将返回NULL
。然后,对GetProcAddress
的调用也将失败并返回NULL
。好吧,你可以看到接下来会发生什么。
当您直接调用MessageBoxA
时,链接器会生成一个导入表,强制加载程序加载user32.dll
。但是,当您取消对MessageBoxA
的调用时,则无需执行此操作。
您应该通过调用GetModuleHandle
替换对LoadLibrary
的调用,然后强制加载库。
最后,您提出此问题的真正原因是您的代码忽略了错误检查。不要那样做。检查Win32函数调用返回的值。如果你这样做了,你就能够自己解决这个问题。