GetModuleHandle
功能说明
获取一个应用程序或动态链接库的模块句柄
(前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。)
HMODULE GetModuleHandle ( LPCTSTR lpModuleName);
参数说明
lpModuleName 模块名称
返回值
如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息
如: GetModuleHandle(NULL); 这将返回自身应用程序句柄
LoadLibrary(注意与GetModuleHandle的区别)
说明
载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源
返回值
Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
参数
lpLibFileName String,指定要载入的动态链接库的名称。
采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
GetProcAddress
说明
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型:
FARPROC GetProcAddress
(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName //函数名
);
参数
hModule [in]包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary或者GetModuleHandle函数可以返回此句柄。
lpProcName [in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值(一般不用亦出错)。如果此参数是一个序数值,它必须在一个字的低字节,高字节必须为0。
返回值: 如果函数调用成功,返回值是DLL中的输出函数地址。
如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。
应用获取MessageBox的地址并付给函数指针调用之:
#include <windows.h>
typedef (CALLBACK * PMessageBox)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);
void main()
{
HMODULE hModule=GetModuleHandle("user32.dll");
if(NULL = = hModule) //若源程序没载入user32.dll则LoadLibrary它
{
hModule = LoadLibrary("user32.dll");
}
PMessageBox MESS = (PMessageBox)GetProcAddress(hModule,"MessageBoxA");
if (MESS)
{
(*MESS)(NULL,"MessageBoxText(内容)","Title(标题)",MB_OK);
}
}
百度了一下这些函数出来了好多API HOOK的知识好诱人啊。。