我需要从我的DLL中加载一些资源(我需要从DLL代码中加载它们),为此我使用了FindResource。从DLL中获取HModule
要做到这一点,我需要DLL的HModule。 如何找到?
(我不知道DLL(用户可修改)的名称(文件名))
我需要从我的DLL中加载一些资源(我需要从DLL代码中加载它们),为此我使用了FindResource。从DLL中获取HModule
要做到这一点,我需要DLL的HModule。 如何找到?
(我不知道DLL(用户可修改)的名称(文件名))
的第一个参数DllMain()
是DLL的HMODULE
。
你可以从DllMain()入口点,第一个参数得到它。写一个,将其存储在一个全局变量:
HMODULE DllHandle;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) DllHandle = hModule;
return TRUE;
}
有一个未公开的黑客工具,对32位和64位Windows版本的任何我见过的作品。一个DLL的HMODULE是相同的值模块的基本地址:
static HMODULE GetThisDllHandle()
{
MEMORY_BASIC_INFORMATION info;
size_t len = VirtualQueryEx(GetCurrentProcess(), (void*)GetThisDllHandle, &info, sizeof(info));
assert(len == sizeof(info));
return len ? (HMODULE)info.AllocationBase : NULL;
}
取决于你的软件是如何架构的,你可能无法访问的DllMain或想要的资源可能甚至不知道它的代码里面一个DLL或exe文件!
DLLMain函数被赋予DLL的模块句柄。将其存储在全局可访问变量的 中。
或者,查找基于已知本地代码的功能模块:
// Determine the module handle by locating a function
// you know resides in that DLL or exe
HMODULE hModule;
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCSTR)&myDLLfuncName, &hModule);
HRSRC hRscr = FindResource(hModule, ............);