2011-03-02 11 views
9

Estoy usando MFC en mi programa C++ (usando Visual Studio 2008). Debo llamar a AfxGetInstanceHandle() al comienzo de mi programa.AfxGetInstanceHandle() desencadena una falla de aserción

Esta función activa un punto de ruptura:

AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle() 
{ ASSERT(afxCurrentInstanceHandle != NULL); 
return afxCurrentInstanceHandle; } 

La declaración ASSERT falla. Me preguntaba si había algo que hacer para inicializar el afxCurrentInstanceHandle antes de intentar acceder a él.

PD: Estoy usando MFC en una dll compartida.

EDITAR

Mi código es así:

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    CoInitialize(NULL); 
    AfxGetInstanceHandle(); 
    return 0; 
} 

me gustaría usar el InstanceHandle con el fin de inicializar un CComModule y luego usarlo para manipular objetos COM.

Respuesta

2

Si está utilizando MFC no debería proporcionar un main, wmain, _tmain o WinMain - MFC proporciona su propio punto de entrada. Coloque el código de inicialización en InitInstance de su clase derivada de CWinApp. Si no tiene una clase derivada de CWinApp, no ha creado el proyecto correctamente; use los asistentes de Visual Studio para crear una aplicación MFC.

+0

Entonces, ¿no hay forma de acceder a AfxGetInstanceHandle() sin tener todo el objeto CWinApp? – Arthur

+0

Creo que estaba haciendo algo mal, y realmente no necesitaba esto para usar el objeto COM. Gracias. – Arthur

+2

Voto abajo porque esto no es verdad. Para las aplicaciones de Windows/GUI su afirmación es correcta, el proyecto wizzard creará una clase derivada de CWinApp. Pero cuando crea una aplicación de consola con soporte MFC, se crea el código fuente con una función principal (_tmain) y se llama primero a AfxWinInit para configurar el MFC. –

5

Esto puede suceder si mezcla unicode/mbcs o modos de compilación de depuración/liberación para DLL/aplicación.

+0

Mi proyecto y todas sus dependencias se cumplen usando MFC en una DLL compartida, con DLL de depuración MultiThreaded y utilizando caracteres de Multibytes. Puede deberse a algo más – Arthur

+0

Esto resolvió el problema que tenía. –

6

Uso:

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

Antes de llamar:

AfxGetInstanceHandle(); 
7

Hice una aplicación de consola con MFC y recibió el mensaje también. Encontré la solución, que necesita un "prólogo" al principio de su main (_tmain, etc.).

int main(int args, char* argv[]) //, char *envp[]) 
{ 
    // initialize MFC and print and error on failure 
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 
    {  
     // TODO: change error code to suit your needs  
     cerr << _T("Fatal Error: MFC initialization failed") << endl;  
     return 1; 
    } 
    AfxGetInstanceHandle(); 
    // TODO: code your application's behavior here. 
    ... 
Cuestiones relacionadas