2008-09-23 17 views
13

Duplicar posible:
How do I get the HMODULE for the currently executing code?¿Cómo obtener el identificador del módulo de mi propio código?

estoy tratando de encontrar un recurso en mi propio módulo. Si este módulo es un ejecutable, eso es trivial: GetModuleHandle(NULL) devuelve el identificador del módulo "principal".

Mi módulo, sin embargo, es una DLL cargada por otro ejecutable. Entonces, GetModuleHandle(NULL) devolverá el identificador del módulo a ese ejecutable, que obviamente no es lo que quiero.

¿Hay alguna forma de determinar el identificador del módulo que contiene el código actualmente en ejecución? Usar el nombre de la DLL en una llamada a GetModuleHandle() me parece un truco (y no es fácil de mantener en caso de que el código en cuestión se trasplante a una DLL diferente).

Respuesta

10

Guarde el controlador del módulo cuando se lo entregue en DllMain y luego úselo más tarde cuando realmente lo necesite. Muchos marcos (por ejemplo, MFC) lo hacen automáticamente.

+0

Podría por favor dar algunos detalles más sobre esta solución? Tengo el mismo problema que el autor del hilo, pero no sé qué es el DllMain, cuándo se llama y cómo puedo almacenar la información que necesito. –

+0

@MarcinK. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx: esto explica qué es DllMain. Es un punto de entrada opcional en su módulo que puede crear y hacer cosas como almacenar el identificador del módulo en una variable global. –

1

Como ya se ha indicado, esto se puede hacer guardando el identificador del módulo pasado a la función DllMain.

Pero hay otras razones por las que debe guardar el controlador.

Por ejemplo, si decide vincular recursos a la DLL utilizando el vinculador de recursos, necesitará este manejador de módulo para obtener estos recursos a través de la API de función LoadResource.

5

Si DLL está vinculado con MFC, entonces hay una manera de conseguir instancia de la DLL en el que una función se llama:

void dll_function() 
    { 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    HINSTANCE dll_instance = AfxGetInstanceHandle(); 
    } 
+0

Gracias por la sugerencia. Para archivos DLL MFC que es una buena solución. Pero aproximadamente la mitad de mis DLL no lo son, así que también necesitaba algo más. No he examinado el código fuente de MFC, pero probablemente también guarden el identificador cuando se carga el archivo DLL. – Pepor

Cuestiones relacionadas