2010-03-07 33 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, ............);