MFC aus C++ aufrufen



  • Hallo,

    ich habe ein MFC-Projekt als statische LIB erstellt und dieses Projekt möchte ich jetzt von C++ aus starten. Hierfür habe ich eine Win32-Anwendung erstellt und besagte LIB dort eingebunden. Als Compiler verwende ich VS2008.

    //Einbindung_GUI_2008.cpp
    #include "stdafx.h"
    #include "Einbindung_GUI_2008.h"
    
    //Headerdatei meiner MFC-LIB
    #include "TabExample1.h"
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // TODO: Hier Code einfügen.
    
        ASSERT(hPrevInstance == NULL);
    
        int nReturnCode = -1;
        CWinThread* pThread = AfxGetThread();
        CWinApp* pApp = AfxGetApp();
    	CTabExample1App::GetTheApp(pApp, pThread);
    
    	//pApp->InitInstance();
    
        // AFX internal initialization
        if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
            goto InitFailure;
    
        // App global initializations (rare)
        if (pApp != NULL && !pApp->InitApplication())
            goto InitFailure;
    
        // Perform specific initializations
        if (!pThread->InitInstance())
        {
            if (pThread->m_pMainWnd != NULL)
            {
                TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
                pThread->m_pMainWnd->DestroyWindow();
            }
            nReturnCode = pThread->ExitInstance();
            goto InitFailure;
    	}
    
        nReturnCode = pThread->Run();
    
    InitFailure:
    #ifdef _DEBUG
        // Check for missing AfxLockTempMap calls
        if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
        {
            TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
                AfxGetModuleThreadState()->m_nTempMapLock);
        }
        AfxLockTempMaps();
        AfxUnlockTempMaps(-1);
    #endif
    
        AfxWinTerm();
        return nReturnCode;
    }
    

    Wobei CTabExample1App die Klasse der MFC-Funktion ist. Dort greife ich auf folgende Funktion zu um pThread und pApp zu bekommen:

    void CTabExample1App::GetTheApp(CWinApp* pApp, CWinThread* pThread)
    {
    	pThread = AfxGetThread();
    	pApp = AfxGetApp();
    }
    

    Mein Problem ist nun, dass der pThread wohl falsch erzeugt/befüllt wird, denn in der Zeile

    pThread->m_pMainWnd->DestroyWindow();
    

    kommt die Fehlermeldung

    0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcccccd34.
    

    was wohl auf einen ungültigen Pointer hinweist bzw. das ParentWindow, dass er zerstören möchte ist zwar nicht NULL aber trotzdem nicht belegt. Kann mir jemand helfen, dieses Problem zu lösen?
    Vielen Dank


  • Mod

    Schmeiß Dein main weg, und lass das alles die MFC machen.
    Dazu ist es IMHO nur nötig das entsprechende CWinApp Objekt in Deiner cpp Datei zu instanziieren.

    So wird das nichts. Du weißt doch in keiner Weise wasalles wie konstruiert werden muss, bzw. in der Main Routine der MFC abläuft.



  • Danke, Martin.
    Diese komische Funktion hab ich mir nicht selber zusammengebastelt.
    Mir wurde gesagt, das sei die "Die Standardmethode zum MFC-Starten" aber mir persöhnlich erscheint es auch plausibler das über CWinApp zu realisieren.

    //CTabExampleApp ist das MFC-Projekt
    CTabExample1App* App = new CTabExample1App();
    

    Ich hab das jetzt gleich mal ausprobiert, ich bekomme aber einen Assertion - Fehler mit dem Kommentar, dass es nur eine Instanz der CWinApp geben darf.

    ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
    

    in appcore.cpp.
    Wie kann ich dann auf die schon vorhandene Instanz zugreifen? Oder instanziere ich falsch?



  • So, inzwischen bin ich einen Schritt weiter.
    Basierend auf dem Ansatz von Martin Richter (an dieser Stelle nochmal ein großes Dankeschön für deine Hinweise), hab ich die Instanz meiner App bekommen!
    Mein Problem war, dass der VS Compiler mir diese unikate Instanz meiner App-Klasse nicht global gesetzt hat und ich somit vom C++-Projekt aus keinen Zugriff drauf hatte.

    Nun, habe ich in meiner C++ - Klasse Zugriff auf die Instanz meines MFC-Projekts.
    Wenn ich aber jetzt versuche mit

    theApp.InitInstance()
    

    die MFC zum laufen zu bringen, hat er Probleme, die Afx... - Variablen zu setzen.

    { ASSERT(afxCurrentResourceHandle != NULL);
    

    was muss ich noch setzen/aufrufen, um die MFC anzuwerfen und meine GUI zu bekommen?


Anmelden zum Antworten