GetProcAddress

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");

你可能感兴趣的:(C/C++)