HMODULE g_hmodule=NULL;
g_hmodule=LoadLibrary(L"Hellpd.dll"); ① 把"Hellpd.dll"地址赋值给g_hmodule变量
FARPROC proc=GetProcAddress(g_hmodule,"StarHook"); ②把"Hellpd.dll"中的"StarHook"函数地址赋值给proc
proc(); //调用proc就等于调用dll中的StarHook函数
MessageBox(L"游戏辅助启动成功");
①加载一个dll或者exe并返回当前地址,如果没有填完整路径系统会使用一个标准的搜索策略找到模块,如果函数无法找到该模块,功能失败。因为是宽字符所以前面要加个"L"。
②从指定的动态链接库(DLL)检索一个导出的函数或变量的地址,参数1:模块句柄(模块起始地址);参数2:要调用的DLL内的函数名。
FARPROC类型
FARPROC 实际就是一个4字节指针,指向一个内存地址。
这个地址一般是指向函数的比如说
GetProcAddress 的返回类型就是一个 FARPROC 他实际是一个函数的地址。
显式加载方式加载DLL
LoadLibrary函数
之前的例子都是通过隐式链接的方式来实现对动态链接库的访问,下面将采用动态加载方式来访问动态链接库。使用动态加载的方式加载链接库时,需要用到LoadLibrary函数。该函数的作用是将指定的可执行模块映射到调用进程的地址空间。函数原型如下:
HMODULE LoadLibrary(LPCTSTR lpFileName);
LoadLibrary函数不仅能够加载DLL(.dll),还可以加载可执行模块(.exe)。一般来说,当加载可执行模块时,主要是为了访问该模块内的一些资源,例如对话框资源、位图资源或图标资源等。该函数有一个字符串类型(LPCTSTR)的参数,该参数指定了可执行模块的名称,既可以是一个.dll文件,也可以是一个.exe文件。如果调用成功,LoadLibrary函数将返回所加载的那个模块的句柄。该函数的返回类型是HMODULE。HMODULE类型和HINSTANCE类型可以通用。
当获取到动态链接库模块句柄后,接下来就要想办法获取该动态链接库中导出函数的地址,这可以通过调用GetProcAddress函数来实现。该函数用来获取DLL导出函数的地址。
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄,就是LoadLibrary函数的返回值
LPCSTR lpProcName // 函数名或函数的序号
//这里应当注意,如果该参数指定的是导出函数的序号,那么该序号必须在低位字中,高位必须是0。
);
P733