DialogBox



  • Hallo zusammen,

    ich hoffe, es zerreißt mich keiner für die Frage ...

    Ich schreibe mit MS-VS13 eine DLL für ein Simulationsprogramm. Diese DLL wird von dem Simulationsprogramm regelmäßig mit einer Parameterliste aufgerufen, innerhalb der DLL mache ich ein paar Berechnungen, die Ergebnisse werden über die Parameterliste zurückgegeben, alles gut, läuft.

    Woran ich mich gerade abarbeite ist der Versuch, jeweils beim Aufruf der DLL (also dann wenn sie startet) eine modale DialogBox anzuzeigen, in die zusätzliche Werte eingeben werden können. Dafür habe ich mich durch die verschiedenen Tutorials gelesen und darauf basierend folgende Schritte durchgeführt:
    1.) Ich habe einige Änderungen an den Projekteigenschaften durchgeführt: a) Laufzeitbibliothek auf "Multithreaded-DLL (/MD)" gestellt b) Verwendung von MFC auf "MFC in einer gemeinsam genutzten DLL verwenden" gestellt. Konfigurationstyp ist wie gehabt "Dynamische Bibliothek (.dll)".
    2.) Ich habe eine Resource zugefügt und darüber einen Dialog ("Resource hinzufügen").
    3.) Per Doppelklick auf die Dialogoberfläche (in der Ansicht des Dialogs) konnte ich die zugehörige header und cpp-Datei generieren (+resource.h, stdafx.h). Diese habe ich nicht großartig geändert, bis auf einige include Anweisungen.

    4.) Die (offensichtlich nicht funktionstüchtige) Idee war, in meinem DLL-Quellcode eine Variable vom Typ des Dialogs zu erstellen ...
    CSelectDlg SD;
    ... und dann DoModal aufzurufen ...
    INT_PTR Ans = SD.DoModal();

    Tatsächlich kompiliert das, aber wenn ich dann mein Simulationsprogramm laufen lasse und die DLL aufgerufen wird erhalte ich die Fehlermeldung: "Debug Assertion failed", Program: ... mfc120d.dll, File: ...afxwin1.inl

    Jetzt wird in allen Tutorials zusätzlich zum Dialog eine Klasse "class CMyApplication : public CWinApp" generiert und DoModal unter der Funktion ::InitInstance() aufgerufen. Habe ich ebenfalls probiert und dabei innerhalb der DLL eine Instanz von CMyApplication generiert. Ich hab Zweifel, dass das richtig ist, as Ergebnis ist aber ohnehin identisch.

    Jetzt habe ich irgendwo gelesen, dass zusätzliche Schritte erforderlich sind, um eine MFC und eine nicht-MFC Anwendung zusammenzubringen. Dabei war von AFX_MANAGE_STATE(AfxGetStaticModuleState( )); die Rede... Da steige ich gerade gedanklich aus und weiß auch nicht, ob das der entscheidende Schritt ist.

    Ich vermute, es wird schon möglich sein, einen Dialogaufruf in eine DLL zu integrieren, aber ich schätze, dabei bin ich auf Hilfe angewiesen. Kann mir jemand helfen?

    Schon jetzt vielen Dank!


  • Mod

    Mach es umgekehrt. Erzeuge eine regular MFC DLL.

    Dann packe Dein anderes Projekt-Zeugs da rein.
    Ist un jedem Falle einfacher. Und ja AFX_MANAGE_STATE muss verwendet werden, wie es in den Headern Deiner erzeugten Datei steht...



  • Vielen Dank für die Antwort. Ich fürchte nur, das wird nicht weniger kompliziert. Das aufrufende Simulationsprogramm ist ein Fortran Code und das gesamte dll-Gerüst wird durch einen automatischen Export aus diesem Simulationsprogramm heraus generiert. Alle Compiler Einstellungen werden dabei mit eingestellt, die Parameterübergabeliste definiert und Header eingebunden usw. Ich versuche es sicherlich mal, aber ich hatte gehofft, dass es, wo es doch so einfach ist, eine simple Messagebox einzubinden, auch nicht so schwer sein sollte einen Dialog einzubinden, in dem zusätzlich ein Textfeld für eine Eingabe auftaucht. Vielleicht ist MFC ja auch ein falscher Ansatz. Sollte es einfachere Ansätze geben, teste ich die gerne auch.

    Update:
    Wenn ich als Projekttyp MFC-Dll wähle dann wird ein Template ohne Resource generiert. Ich bekomme es dann schon hin, dass diese DLL dann von meinem SimProg aufgerufen wird, immerhin. Zu Beginn meiner eigenen Routine schreibe ich dann
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    und innerhalb meines eigenen Quellcodes definiere ich
    CType850LibApp theApp;
    Ich muss dann eine Resource hinzufügen und wähle einen Dialog und lasse mir die entsprechenden .h und .cpp Dateien erstellen. An diesen Dateien ändere ich auch erst mal nix.
    Dann füge ich unter CType850LibApp::InitInstance() folgende Code hinzu:
    CSelDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();

    Lässt sich kompilieren, dann passiert aber nix.
    Wenn ich
    theApp.InitInstance();
    explizit aufrufe, dann kommt - wie in meinen ersten Versuchen - beim Aufruf die Debug Assertion Meldung.

    Kann jemand etwas damit anfangen? Macht es Sinn, den gesamten Code zu posten?

    Danke für die Hilfe ...


Log in to reply