我需要從我的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, ............);