2010-03-07 2 views
3

Мне нужно загрузить некоторый ресурс из моей DLL (мне нужно загрузить их из DLL-кода), для этого я использую FindResource.Получить HModule изнутри DLL

Для этого мне нужен HModule DLL. Как это найти?

(я не знаю, имя (имя файла) из DLL (пользователь может изменить его))

ответ

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, которые я видел. HMODULE из DLL имеет то же значение, как базовый адрес модуля:

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. Храните его в глобальной переменной .

Или Lookup модуль, основанный на функции известного местного кода:

// 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, ............); 
Смежные вопросы