本例通过在一个DLL中实现一个辅助函数 DumpModule ,在辅助函数内调用 GetModuleHandle 函数,GetModuleHandleEx 函数及使用伪变量 __ImageBase,展示了三种方法得到可执行文件或 DLL 在进程虚拟地址空间的实例句柄。
DLL中 DumpModule 函数的实现:
#define DLLWITHGETMODULE extern "C" __declspec(dllexport)
#include "DllwithGetModule.h"
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
extern "C" const IMAGE_DOS_HEADER __ImageBase; //伪变量,指向当前正在运行的模块的基地址
void DumpModule()
{
//得到当前正在运行的应用程序的基地址
HMODULE hModule = GetModuleHandle(NULL);
_tprintf(TEXT("with GetModuleHandle(NULL) = 0x%x\r\n"),hModule);
//使用伪变量得到当前正在运行模块的基地址
_tprintf(TEXT("with __ImageBase = 0x%x\r\n"),(HINSTANCE)&__ImageBase);
//传入DumpModule函数的地址给GetModuleHandleEx函数,得到DumpModule函数所在模块的基地址
hModule = NULL;
::GetModuleHandleEx(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(PCTSTR)DumpModule,
&hModule);
_tprintf(TEXT("with GetModuleHandleEx = 0x%x\r\n"),hModule);
}
另外新建一个Win32 控制台项目,主函数的实现为:
int _tmain()
{
DumpModule();
return 0;
}
运行结果为: