example c++ c winapi

c++ - example - ¿Cómo obtengo el HMODULE para el código que se está ejecutando actualmente?



loadlibrary c (4)

El HMODULE es el HINSTANCE es la dirección base del módulo. Entonces, vería cómo funcionó. Pero si todo lo que quiere es el HMODULE del ejecutable, ¿por qué no enumerar todos los HMODULE en el proceso (EnumProcessModules)? Uno de ellos tendrá tu .lib vinculado.

La limitación que veo es que no tiene idea de qué DLL o EXE proviene su .lib. Es posible que desee comparar los HMODULE (direcciones base) contra _ReturnAddress que obtiene de .lib. Su .lib pertenecerá al HMODLUE más alto más pequeño que su _ReturnAddress

Tengo una biblioteca estática que puede vincularse con .exe o .dll . En tiempo de ejecución, quiero que una de las funciones de mi biblioteca obtenga el HMODULE para lo que sea que haya sido vinculado al código de la biblioteca estática.

Actualmente uso el siguiente truco (inspirado en este foro ):

const HMODULE GetCurrentModule() { MEMORY_BASIC_INFORMATION mbi = {0}; ::VirtualQuery( GetCurrentModule, &mbi, sizeof(mbi) ); return reinterpret_cast<HMODULE>(mbi.AllocationBase); }

¿Hay una mejor manera de hacer esto que no se vea tan hacky?

(Nota: El propósito de esto es cargar algunos recursos de Win32 que sé que mis usuarios habrán vinculado al mismo tiempo que mi biblioteca estática).


Me gustaría ver GetModuleHandleEx() usando la bandera GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS . Parece que puede cambiar su GetCurrentModule() para llamar a esta rutina en lugar de VirtualQuery() , y pasar la dirección de GetCurrentModule() como el argumento lpModuleName .

ETA:

const HMODULE GetCurrentModule() { DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS; HMODULE hm = 0; ::GetModuleHandleEx( flags, reinterpret_cast<LPCTSTR>( GetCurrentModule ), &hm ); return hm; }

No lo intenté, pero creo que haré lo que quieras.


__ImageBase es un símbolo generado por un enlazador que es el encabezado DOS del módulo (solo MSVC). A partir de eso, puede HINSTANCE su dirección a HINSTANCE o HMODULE . Por lo tanto, es más conveniente que pasar por una API.

Entonces solo necesitas hacer esto:

EXTERN_C IMAGE_DOS_HEADER __ImageBase; #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)

De http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx


HMODULE GetCurrentModule() { // NB: XP+ solution! HMODULE hModule = NULL; GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hModule); return hModule; }