常见的获取方法是通过 GetModuleHandle(NULL),获取当前EXE句柄,然后通过GetModuleFileName获取EXE路径。Dll在该路径下加上 “xxx.dll”,即可。
但是有时候 dll 与 exe 不一定在一个位置,甚至 dll 并没有按照指定的目录关系与 exe 有明确的对应关系,甚至 dll 的最终名称作为 dll 的编写者并不清楚(比如重命名)。
有以下几种方法:
- 在dllmain中保存HMODULE
- 使用如下代码 GetSelfModuleHandle
HMODULE GetSelfModuleHandle()
{
MEMORY_BASIC_INFORMATION mbi;
// AABB 是 dll 内部任意一个函数或全局变量地址
return ((::VirtualQuery(AABB, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
// 更简单的直接用当前函数本身
return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
}
- 使用 GetModuleHandleEx
HMODULE hModule = NULL;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(LPCSTR)&XXX, //可以是任何函数,全局变量等的地址
&hModule);
// 更简单的
HMODULE hModule = NULL;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
__FUNCTION__,
&hModule);
HMODULE hModule = NULL;
GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
__FUNCTIONW__,
&hModule);
- 使用 __ImageBase
extern "C" IMAGE_DOS_HEADER __ImageBase;
HMODULE _hd = (HMODULE)&__ImageBase;
以上只要得到了 HMODULE ,自然可以通过 GetModuleFileName 来获取了。