我需要从我的DLL加载一些资源(我需要从DLL代码加载它们),为此我正在使用FindResource。
要做到这一点,我需要DLL的HModule。 怎么找到?
(我不知道DLL的名称(文件名)(用户可以更改它))
答案 0 :(得分:10)
DllMain()
的第一个参数是DLL的HMODULE
。
答案 1 :(得分:10)
你可以从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;
}
答案 2 :(得分:1)
根据您的软件架构设置,您可能无法访问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, ............);