Wie MFC Initialisieren ¿ (afxCurrentInstanceHandle == NULL ¿)



  • Yo,
    Ich habe ein Programm das, wenn ich es im Debugmodus ( Visual C++ .NET ) ausführe dauernt Meldungen über fehlgeschlagene "Assertions" bringt.

    Unter anderem heißt es :

    Debug Assertion Failed!

    Program:[Name der ausgeführten Datei]
    File:[....]\afxwin1.inl
    Line:23

    Die Anweisung in der MFC sieht so aus :

    ASSERT(afxCurrentInstanceHandle != NULL);
    

    afxCurrentInstanceHandle ist also NULL was anscheinend nicht so sein sollte.
    Das Programm scheint aber trotzdem zu funktionieren.

    Ich hab irgendwo was gelesen das man die MFC vor verwendung Initialisieren muss, hängt das damit zusammen oder warum is afxCurrentInstanceHandle == NULL ¿



  • Machst du nicht gerade eine Überprüfung, dass es nicht Null ist? Und somit ist es nicht Null?



  • Paul_C. schrieb:

    Machst du nicht gerade eine Überprüfung, dass es nicht Null ist?

    Doch das tue ich

    Paul_C. schrieb:

    Und somit ist es nicht Null?

    Warum somit ¿ Ich denke die Überprüfung ändert den Wert in afxCurrentInstanceHandle nicht.

    Aus dem MSDN :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_ASSERT.asp
    "If the result is 0, the macro prints a diagnostic message and aborts the program. If the condition is nonzero, it does nothing."

    Wenn der an ASSERT übergebene Ausdruck falsch ist, gibt ASSERT eine Meldung aus, und das ist hier der Fall. Daraus schließe ich : afxCurrentInstanceHandle == NULL.



  • Paul_C. schrieb:
    Und somit ist es nicht Null?

    Warum somit ¿ Ich denke die Überprüfung ändert den Wert in afxCurrentInstanceHandle nicht.

    nein es ändert den wert nicht, da ist der wert halt einfach NULL. Jetzt musst du nur noch rausfinden warum der wert an dieser Stelle NULL ist.

    Wenn du das Programm compilieren kannst und ausführen kannst drück bei der Fehlermeldung mal wiederholen und öffne die Aufrufliste. Da siehst du was zuletzt aufgerufen wurde. Zu dem Thema gibts im Magazin glaub ich auch nen Artikel.



  • Taelan schrieb:

    Paul_C. schrieb:
    Und somit ist es nicht Null?

    Warum somit ¿ Ich denke die Überprüfung ändert den Wert in afxCurrentInstanceHandle nicht.

    nein es ändert den wert nicht, da ist der wert halt einfach NULL. Jetzt musst du nur noch rausfinden warum der wert an dieser Stelle NULL ist.

    Ja genau, ich würde gerne wissen warum der NULL ist.
    Der Wert scheint auch NULL zu bleiben, ich bekomme jedes mal wenn ich z.b. ein Fenster erstelle diese Meldung also hunderte male da ich einen Umfangreichen Dialog habe.
    Ich vermute aufgrund des Namens der Variable das Sie eigentlich ziemlich am Anfang des Programms initialisiert werden sollte.

    Taelan schrieb:

    Wenn du das Programm compilieren kannst und ausführen kannst drück bei der Fehlermeldung mal wiederholen und öffne die Aufrufliste. Da siehst du was zuletzt aufgerufen wurde. Zu dem Thema gibts im Magazin glaub ich auch nen Artikel.

    Ich hab mir mit dem Debugger schon angeschaut was so zuletzt aufgerufen wurde aber das erklärte nicht warum afxCurrentInstanceHandle NULL ist.

    Den Artikel würde ich mir gerne mal anschauen, wo finde ich den ¿





  • estartu_de schrieb:

    Im Magazin 🙂

    Aha danke, das "Magazin" kannte ich nicht.
    Ich denke mal das der Artikel "Debuggen mit VC++6" gemeint ist. Ich werd mir das mal anschauen.



  • Aalsooo, ich hab mir den Artikel durchgelesen, is wirklich interessant und es steht einiges drin das ich noch nicht wusste.

    Aber der Debugger kann mir doch nicht sagen wie ich afxCurrentInstanceHandle initialisieren soll, oder ¿

    Vieleicht is das noch wichtig :
    Die Meldungen kommen aus AfxGetInstanceHandle, diese Funktion wird in meinem Programm zum Beispiel von AfxRegisterWndClass, CWnd:CreateEx, AfxEndDeferRegisterClass aufgerufen.



  • Ich habe das Gefühl, du hast eine Zeile aus der InitInstance gelöscht, die das erledigt hätte.
    Leg doch mal ein neues Projekt mit den passenden Vorgaben an und vergleiche dann.

    Sollte es sogar beim neuen Projekt passieren, wird es schwierig.

    PS: Freut mich, wenn dir der Artikel trotzdem geholfen hat. 🙂



  • estartu_de schrieb:

    Ich habe das Gefühl, du hast eine Zeile aus der InitInstance gelöscht, die das erledigt hätte.
    Leg doch mal ein neues Projekt mit den passenden Vorgaben an und vergleiche dann.

    Sollte es sogar beim neuen Projekt passieren, wird es schwierig.

    PS: Freut mich, wenn dir der Artikel trotzdem geholfen hat. 🙂

    Seltsam
    Mein Quelltext sollte also eine Funktion namens InitInstance enthalten ¿
    So ne Funktion hab ich bei mir nicht, was sollte da den alles rein ¿

    Meinst du die CWinApp::InitInstance ¿
    Brauch ich auch eine CWinApp Instanz für mein Programm ¿



  • die dll kann auch im Verzeichnis der exe-Datei stehen, wenn du sie nicht ns System-Verzeichnis kopieren willst



  • Was hast du für ein Projekt? Ich war von einem MFC Projekt ausgegangen. 😕



  • Pellaeon schrieb:

    die dll kann auch im Verzeichnis der exe-Datei stehen, wenn du sie nicht ns System-Verzeichnis kopieren willst

    Was für ne DLL ¿

    estartu_de schrieb:

    Was hast du für ein Projekt? Ich war von einem MFC Projekt ausgegangen. 😕

    Das Projekt ist ein normales Win32 Projekt.



  • Also eine Konsolenanwendung. Sorry, damit hab ich kaum Erfahrung. 😞
    Soll ich dich mal ins Konsolenforum schieben?

    Palleon meinte sicher einen anderen Beitrag, in dem es um Dlls geht. 😉



  • estartu_de schrieb:

    Also eine Konsolenanwendung. Sorry, damit hab ich kaum Erfahrung. 😞
    Soll ich dich mal ins Konsolenforum schieben?

    Palleon meinte sicher einen anderen Beitrag, in dem es um Dlls geht. 😉

    Nein eine Konsolenanwendung ist was anderes - zumindest in Visual C++ 6. Bei mir steht da "Win32 Application".
    Die Einsprungsfunktion ist bei mir die WinMain und ich verwende MFC um die Fenster und so zu verwalten.

    Ich hab mir gedacht da ich die MFC verwende gehört das Thema in das MFC Forum. Eventuell passt das auch besser ins WinAPI Forum, iss irgendwie sone Mischung aus beidem.

    *Grübel*



  • Frag doch bei WinAPI einfach mal, ob die afxCurrentInstanceHandle kennen. 🙂



  • [|]===

    Hammer.

    Die frage nach dem Projekttyp hat mich auf die Idee gebracht mal ein Projekt mit dem "MFC-Anwendungs-Assistent" zu erstellen und das auseinander zu nehmen.

    Irgendwie bin ich dann auf den Begriff "afxWinMain" gekommen. Diese Funktion ist die Einsprungsfunktion wenn das Projekt mit dem MFC-Anwendungsassistent erstellt worden ist. Diese Funktion ruft unter anderem AfxWinInit auf.

    /////////////////////////////////////////////////////////////////////////////
    // Standard WinMain implementation
    //  Can be replaced as long as 'AfxWinInit' is called first
    
    int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	LPTSTR lpCmdLine, int nCmdShow)
    {
    	ASSERT(hPrevInstance == NULL);
    
    	int nReturnCode = -1;
    	CWinThread* pThread = AfxGetThread();
    	CWinApp* pApp = AfxGetApp();
    
    	// AFX internal initialization
    	if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
    		goto InitFailure;
    

    Ich hab den Aufruf jetzt in meinem Programm eingebaut :
    So initialisiert man die MFC

    int	WINAPI	WinMain(HINSTANCE hInstanz, HINSTANCE hVorherigeInstanz, LPSTR zCmdLine, int CmdShow)
    {
    	::AfxWinInit(hInstanz, hVorherigeInstanz, zCmdLine, CmdShow);
    

    Un afxCurrentInstanceHandle isch jezt != NULL.

    Es geht doch nichts über eine gute Dokumentation.

    (Mir fehlen hier noch Smileys (
    http://www.forum-3dcenter.org/vbulletin/images/3dc/smilies/ugly/uglyirre.gif

    http://www.forum-3dcenter.org/vbulletin/images/3dc/smilies/ugly/uglyhammer.gif

    http://img.smiliedb.de/19a5be4c/sdb81087.gif
    ))


Anmelden zum Antworten