GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
参数:
hModule
[in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetModuleHandle函数可以返回此句柄。
lpProcName
[in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。
返回值:
如果函数调用成功,返回值是DLL中的输出函数地址。
如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。
FARPROC 是一个4字节指针,指向一个函数的内存地址,例如
GetProcAddress 的返回类型就是一个FARPROC。
如果你要存放这个地址,可以声明以一个 FARPROC变量来存放。
GetProcAddress返回的是一个函数地址的指针。
声明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你应该知道你要的函数的类型是什么,可以用typedef的方法定义函数类型,然后定义一个这种类型的变量,你得到地址后,将地址的类型转换并存到那个变量中就行了。例如:
这是RunHook定义:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}
这是全局声明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);
这两种调用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");