2010-03-07 146 views
3

我需要從我的DLL中加載一些資源(我需要從DLL代碼中加載它們),爲此我使用了FindResource。從DLL中獲取HModule

要做到這一點,我需要DLL的HModule。 如何找到?

(我不知道DLL(用戶可修改)的名稱(文件名))

回答

9

的第一個參數DllMain()是DLL的HMODULE

8

你可以從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; 
} 
0

取決於你的軟件是如何架構的,你可能無法訪問的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, ............);