从DLL内部获取HModule

时间:2010-03-07 13:09:21

标签: c++ dll resources

我需要从我的DLL加载一些资源(我需要从DLL代码加载它们),为此我正在使用FindResource。

要做到这一点,我需要DLL的HModule。 怎么找到?

(我不知道DLL的名称(文件名)(用户可以更改它))

3 个答案:

答案 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, ............);