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的知识好诱人啊。。