Dialog in DLL anzeigen



  • Hi,

    Sorry dass ich jetzt den dritten Thread in Folge eröffne, aber ich komm einfach nicht weiter.

    Ich habe eine Anwendung erstellt, die in Form einer DLL angefertigt werden soll. Leider funktioniert das mit meiner Anwendung nicht so einfach, da ich ein SDI nutze und somit einige komplexe Probleme entstehen (http://www.c-plusplus.net/forum/viewtopic-var-t-is-227554.html).

    Da ich Daten zwischen Anwendungen austauschen muss, wurde mir in folgendem Thread geholfen: http://www.c-plusplus.net/forum/viewtopic-var-t-is-227670.html
    Leider fällt das auch weg, da ich an der Master-Anwendung nichts ändern darf (außer natürlich den Aufruf meiner DLL).

    Nachdem das alles nicht funktioniert habe, habe ich mir gedacht dass ich den Inhalt meiner Anwendung der durch ein SDI angezeigt wird, auf einen CDialog packe. Denn in einer DLL können ja mit dem GUI-Editor Dialoge erstellt werden. Somit hab ich mir gedacht, dass wenigstens das funktioniert.

    Leider funktioniert auch das nicht. Ich habe den Verdacht, dass das mit den Ressourcen zusammenhängt, bzw. dass diese nicht in die DLL importiert werden können.

    Dazu exportiere ich in der DLL folgende Funktion:

    extern "C" __declspec(dllexport)void StartDlg();
    void StartDlg()
    {
    	CDlg *dlg = new CDlg();
    	dlg->DoModal();
    }
    

    CDlg habe ich mit dem Ressourcen-Editor erstellt und mit dem Assistent eine Klasse erstellt.

    Die Anwendung stürzt an folgender stelle ab:

    DoModal():

    HGLOBAL hDialogTemplate = m_hDialogTemplate;
    HINSTANCE hInst = AfxGetResourceHandle();
    

    Assert:

    { ASSERT(afxCurrentResourceHandle != NULL);
    

    Das ist meine letze Idee -> ich weiss wirklich nicht mehr weiter.

    Vielen Dank
    Lg
    Kerberos



  • Habs hinbekommen!

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CDlg* dlg = new CDlg;
    dlg->Create(IDD_DIALOG1, NULL);
    dlg->ShowWindow(SW_SHOW);
    

    Aber würde trozdem gerne wissen, ob ich den Inhalt meiner bisherigen SDI Anwendung auf den Dialog packen kann, oder ob ich dann nach ein oder zwei Wochen Arbeit bemerke dass das auch nicht geht?

    Ich möchte Controls dynamishc Erstellen, ein paar weitere Dialoge erstellen und nazeigen, weitere DLLs laden und Zeichen-Operationen ausführen.

    Danke
    Lg Kerberos


  • Mod

    kerberos schrieb:

    Leider fällt das auch weg, da ich an der Master-Anwendung nichts ändern darf (außer natürlich den Aufruf meiner DLL).

    Albern! So ein Schwachfug.

    Dann pack den Aufruf und das umkapseln der Daten in eine DLL und starte einen neuen Prozess. Dann hast Du halt eine DLL und eine EXE.. 😃
    Dann kannst Du immer noch mit Deiner SDI Anwednung leben wie Du möchtest...

    Ich verstehe Dein Problem nicht!



  • Hi Martin,

    mein Problem ist dass wenn ich die aufrufende Exe nicht verändern soll, auch nicht den Code dahin ändern kann dass die Master-Anwendung den Speicher freigibt.

    Die Master-Anwendung beinhaltet die Struktur, also darf ein externer Prozess nicht auf diesen Speicher zugreifen. Darum hast du ja auch den Vorschlag gemacht mit Hilfe von Memory Mapped Files den Speicher für meine Anwendung freizugeben.

    Aber ich muss ja die Datei die sich im Speicher befindet auch füllen. Das muss ja die Master-Anwendung übernehmen, da diese Master-Anwendung die Struktur verwaltet und aktualisiert. Also müsste ich die Master-Anwendung anpassen und das geht leider nicht.

    Imho wäre es ja nicht so schlimm wenn meine Anwendung als Dialog läuft, wenn es denn funktioniert. Der Aufwand wäre auch nicht sehr groß, oder geht das auch wieder nicht ohne tiefe Einblicke in die MFC-Klassen?

    Viele Grüße
    Kerberos


  • Mod

    Ich verstehe Dein Problem immer noch nicht:

    1. Masteranwendung ruft DLL auf, und übergibt Datenzeiger auf Daten (const)
    2. DLL verpackt die aten geeignet,öffnet eine Memory Mapped File
    3. DLL startet SDI Anwendung und übergibt Datei
    4. SDI zeigt zeigt Daten an.

    Alles entkoppelt! Wo ist das Problem?

    Doc/View passt nicht in eine Dialog Applikation.



  • 👍

    Danke!



  • Sorry wenn ich schon wieder frage, aber wie kann ich eine Struktur in eine virtuelle Datei schreiben und diese wieder auslesen?

    Da ich das Ganze komplett mit Hilfe der MFC mache, wäre auch CMemFile denkbar.

    Danke


  • Mod

    Wenn es eine Memory Mapped File ist dann kannst Du doch einfach den Speicher nutzen wie er ist und die Struktur kopieren.
    Ansonsten nim doch jede beliebige Schreibfunktion!

    Die DLL kann doch auch die MFC verwenden... 🕶



  • Hi Martin,

    Die DLL kann doch auch die MFC verwenden...

    Das meinte ich damit, ich möchte ja die MFC verwenden:

    Da ich das Ganze komplett mit Hilfe der MFC mache, wäre auch CMemFile denkbar.

    Leider bekomm ich es nicht hin und ich finde auch nichts dazu im Internet. Also wäre ich dir dankbar wenn du mir den Code dazu posten würdest. Ich hänge jetzt schon die ganze Woche an diesem Problem fest und komme nicht weiter, vielleicht liegts ja daran dass ich es nicht hinbekomme.

    Also wäre nett wenn du mir einen Beispiel-Code posten könntest wie ich in einer anendung eine Struktur in eine virtuelle Datei schreibe und diese wieder in einer Anderen Anwendung auslesen kann.

    Danke!
    Viele Grüße



  • Hi,

    hat sich erledigt, weil ich in beide Richtungen kommunizieren muss. Also muss ich doch die Lösung mit dem Dialog durchziehen.

    Trozdem Danke
    Viele Grüße
    Kerberos


  • Mod

    kerberos schrieb:

    hat sich erledigt, weil ich in beide Richtungen kommunizieren muss. Also muss ich doch die Lösung mit dem Dialog durchziehen.

    Selbst wenn Du in beide Richtungen kommunizierst müsste es gehen.
    Es wird doch kein Stück einfacher, wenn Du Deine SDI Applikation als DLL hast!

    Aber wenn Du den harten Weg gehen musst:

    1. Lege ein DLL Projekt an.
    2. Benenne Deine InitInstance Klasse Deiner SDI API um in Init und ExitInstance dito.
    3. Baue eine Funktion Doit
    Die ruft Init auf, dann Run, dann Exit.
    Schau Dir den MFC Code an.
    4. Die InitInstance und ExitInstance der DLL sollte ansonsten leer sein.
    Nun mach aus Deinem Projekt eine Standard-DLL

    Für mich ist das unsinnig ohne Ende...


Log in to reply