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