获取已经载入进程空间的模块句柄。
函数声明:
HMODULE WINAPI GetModuleHandle(
_In_opt_ LPCTSTR lpModuleName
);
参数:
LPCTSTR lpModuleName
需要获取句柄的模块名。(.dll或.exe文件),若无后缀,默认为.dll。不必指定所在模块路径,若需指定,则需用反斜杠\。模块名必须与当前映射到调用进程空间的模板名一致。不会获取使用标志LOAD_LIBRARY_AS_DATAFILE加载的模块句柄。
返回:
若成功,则返回指定模块的句柄值;反之,返回null。使用GetLastError获取错误信息。
头文件:
winbase.h(包含了windows.h)
lib库文件:
kernel32.lib
dll库文件:
kernel32.dll
实例:
#include "stdafx.h"
#include <windows.h>
typedef int (CALLBACK * PMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT UType);
void main()
{
HMODULE hModule = GetModuleHandle("user32.dll");
printf("LoadLibrary front: hModule = 0x%x\n", hModule);
//hModule = NULL;
if (NULL == hModule) //若源程序没载入user32.dll则LoadLibrary它
{
hModule = LoadLibrary("user32.dll");
}
printf("LoadLibrary rear: hModule = 0x%x\n", hModule);
PMessageBox MESS = (PMessageBox)GetProcAddress(hModule, "MessageBoxA");
if (MESS)
{
(*MESS)(NULL, "MessageBoxText(内容)", "Title(标题)", MB_OK);
}
}
输出:
参考网址