如果在exe中或方便获取 dll的HMODULE时,获取 自身路径是很方便的,但是有时不方便获取 自身HMODULE却又想得到本模块在磁盘上的路径,有没有办法?
有,看代码:
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define QM_7Z_IMG _T("7z.dll")
__declspec(dllexport) void Test()
{
TCHAR szModuleName[MAX_PATH] = { 0 };
HMODULE hSubHandle;
if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&__ImageBase, &hSubHandle))
{
if (GetModuleFileName(hSubHandle, szModuleName, MAX_PATH) > 0)
{
TCHAR* szLast= _tcsrchr(szModuleName,'\\');
if (szLast)
{
*szLast = _T('\0');
_tcscat_s(szModuleName, MAX_PATH,_T("\\") );
_tcscat_s(szModuleName, MAX_PATH, QM_7Z_IMG);
MessageBox(NULL, szModuleName, _T("info"), MB_OK);
}
}
}
return;
}
核心是获取 __ImageBase这个地址,这个是模块加载后就存在的符号,借用它得到本模块的地址,然后使用GetModuleHandleEx来获取 自身的HMoudle , 其它事就简单了。
另一种方法:
HMODULE GetSelfModuleHandle()
{
MEMORY_BASIC_INFORMATION mbi;
return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0)
? (HMODULE) mbi.AllocationBase : NULL);
}