DLL: Zeigen eines Formulares innerhalb der Bibliothek



  • Hallo.

    Ich habe eine dynamische Bibiliothek geschrieben und eine Host-Anwendung, welche die ein oder andere Funktion aus dieser DLL benutzt. Bis auf ein Problem läuft alles einwandfrei. Im Sourcecode der DLL ist folgende Funktion folgend deklariert.

    extern "C" __declspec(dllexport) bool ShowLangDialog(void)
    {
     if(frmLangDialog->Execute(LangPath))
      return true;
     return false;
    }
    

    frmLangDialog ist ein Formular innerhalb der DLL. Die Funktion Execute ist öffentlich und führt unter anderem die Funktion ShowModal() durch. Kompiliert und Verbunden wird erfolgreich. Der Aufruf der Funktion ShowLangDialog löst zur Laufzeit einen Fehler mit der Nachricht "EAccessViolation" aus.

    Mein Problem ist also, dass ich es nicht hin bekomme, in einer DLL ein Formular zu kreieren und dieses zu zeigen. Was muss ich tun um dieses zu lösen?

    Ich habe selbst verständlich die Suchfunktion benutzt, jedoch nichts passendes gefunden, sorry.
    Ich danke jedem, der mir helfen möchte, im Voraus 😉



  • Erzeugst Du das Formular auch irgendwo VOR dem Anzeigen?



  • Hi.
    Das Formular habe ich im DLL-Projekt mit dem Form-Designer erstellt (Neu -> Form"). Ich habe gehört, dass ich die Klasse des Forms auch exportieren muss, verstehe aber nich warum und wie.



  • Zeig mal mehr Code.



  • Vas schrieb:

    Hi.
    Das Formular habe ich im DLL-Projekt mit dem Form-Designer erstellt (Neu -> Form"). Ich habe gehört, dass ich die Klasse des Forms auch exportieren muss, verstehe aber nich warum und wie.

    Ich meinte eigentlich im Programm- Ablauf!
    Irgendwo mit new ... ???

    Gruss
    Frank



  • Hallo.

    Ich meinte eigentlich im Programm- Ablauf!
    Irgendwo mit new ... ???

    Nein.

    Zeig mal mehr Code.

    // untInterpreter.cpp (DLL)
    ...
    #include "untLangDialog.h"
    ...
    //---------------------------------------------------------------------------
    // Sprachauswahldialog (DLL-Export)
    //---------------------------------------------------------------------------
    extern __declspec(dllexport) bool ShowLangDialog(void)
    {
     return frmLangDialog->Execute(LangPath)
    }
    ...
    
    // untLangDialog.h (DLL)
    ...
    class TfrmLangDialog : public TForm
    {
    public:
         bool Execute(AnsiString sDir); 
    };
    ...
    
    // untLangDialog.cpp (DLL)
    ...
    //---------------------------------------------------------------------------
    // Dialog anzeigen und auswerten
    //---------------------------------------------------------------------------
    bool TfrmLangDialog::Execute(AnsiString sDir)
    {
     ...
     frmLangDialog->ShowModal();
     ...
    }
    ...
    
    // untHost.cpp (Host)
    ...
    extern __declspec(dllexport) bool ShowLangDialog(void); // Global
    ...
    void __fastcall TForm1::btnLangClick(TObject *Sender)
    {
     ShowLangDialog();
    }
    ...
    

    Das Problem ist eigendlich nur, dass Anzeigen, eines von Borland automatisch erstellten Formulares in der DLL, von außerhalb der DLL (also das Hostprogramm).
    Ich hoffe mein Problem ist deutlich geworden. 🙂

    Tschüss.



  • Hi,

    wie Altenburger schon schreibt, musst du das Formular erzeugen,
    ausserhalb der Klasse TfrmLangDialog:

    // untLangDialog.cpp (DLL)
    ...
    //---------------------------------------------------------------------------
    // Dialog anzeigen und auswerten
    //---------------------------------------------------------------------------
    
    void __fastcall Execute(AnsiString sDir)
    {
       ...
       frmLangDialog = new TfrmLangDialog(NULL);
       ...
       frmLangDialog->ShowModal();
       delete frmLangDialog;     // und später löschen
    
    }
    

    Im übrigen ist die Deklartion der Exportfunktion hier falsch am Platze:

    // untHost.cpp (Host)
    ...
    extern __declspec(dllexport) bool ShowLangDialog(void); // Global
    ...
    

    Das gehört in den DLL-Header als Schnittstelle...

    kpeter



  • Hi.

    Ich danke euch! Darauf wäre sicherlich nie ohne Hilfe gekommen.

    Tschüss.


Anmelden zum Antworten