I need to load some resource from my DLL (i need to load them from the DLL code), for doing that I'm using FindResource.
To do that i need the HModule of the DLL. How to find that?
(I do not know the name (filename) of the DLL (the user can change it))
You get it from the DllMain() entrypoint, 1st argument. Write one, store it in a global variable:
HMODULE DllHandle;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) DllHandle = hModule;
return TRUE;
}
There's an undocumented hack that works on any version of 32-bit and 64-bit Windows that I've seen. The HMODULE of a DLL is the same value as the module's base address:
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;
}
The first argument to DllMain()
is the HMODULE
of the DLL.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With