2009-11-17 8 views
37

El HINSTANCE de una aplicación win32 se pasa a WinMain, pero ¿hay alguna otra manera de determinar el HINSTANCE actual (en caso de que no pudieses saberlo, soy muy nuevo para la programación de win32)? Necesito crear una ventana dentro de una biblioteca y (dado que la biblioteca es multiplataforma), id prefiere no tener que pasarla.¿Determinar el HINSTANCE actual?

Respuesta

61

Si falla la memoria, GetModuleHandle(NULL); devuelve el identificador de instancia.

+4

No es totalmente correcto: Vuelve a aumentar el HINSTANCE del exe. Si el código se ejecuta en un archivo DLL, esto puede conducir a comportamientos incorrectos –

+1

@Serge: por lo que está diciendo, el HINSTANCE del ejecutable es exactamente lo que quiere. –

+4

+1: Al pasar un nombre de módulo, esa función se puede usar para obtener 'HINSTANCE' de las DLL también. Tenga en cuenta que 'HINSTANCE' y' HMODULE' son esencialmente equivalentes en las versiones modernas de Windows. –

8

Si está utilizando MFC, puede usar AfxGetInstanceHandle.

Si no está utilizando MFC que puede utilizar: GetWindowLong (CVent, GWL_HINSTANCE)

+0

¿Ese método es solo MFC? – dicroce

+0

Ya, pero también lo actualicé con un modo que no es MFC. –

+1

Eso supone que ya tengo una ventana (y por lo tanto, y hwnd) ... Estoy tratando de llevar el trabajo de la creación de ventanas a mi biblioteca ... – dicroce

13

__ImageBase es su amigo, especialmente en el caso de las bibliotecas.

Nota que el puesto relacionado el blog (por R. Chen, aunque no es el mismo puesto como el vinculado por Brian Bondy) vale la pena leer (incluyendo los comentarios!)

+0

Ignorando el engorroso [GetModuleHandleEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683200.aspx) con 'GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS', esta es realmente la única forma ** confiable ** de encontrar el mango del módulo, y debería ser la respuesta aceptada. – IInspectable

0

La función AfxGetStaticModuleState() hace el truco . Si lo llama dentro de un dll, las funciones devuelven el manejador al dll, si la llamada dentro de un exe devuelve el manejador al ejecutable.

DWORD size; 
TCHAR fileName [MAX_PATH]; 
HMODULE hModule = AfxGetStaticModuleState()->m_hCurrentInstanceHandle; 
::GetModuleFileName (hModule, fileName, size); 
+1

La pregunta está etiquetada * winapi *. No hay 'AfxGetStaticModuleState' en la API de Windows. – IInspectable

Cuestiones relacionadas