VCL in Dll



  • Hallo,
    könnt ihr mir bitte helfen? Ich möchte eine Dll mit einer Form erstellen und möchte das die angezeigt wird wenn Dll dynamisch eingebunden wird. Ich habs zwar (mit Hilfe eines Buches) geschaft eine Dll zu erstellen und einzubinden und Ihr auch eine Funktion abzuverlangen, aber ich grieg einfach die Form nicht geöffnet. Und weiß auch nicht wo ich da ansetzen muß.
    Gruß Matthias



  • Schau mal hier. Damit hab ich es hinbekommen.



  • Da wird nur erklärt, wie es mit einer statisch geladenen DLL geht. Ich stehe vor dem gleichen/selben Problem wie dein Vorredner und kriege es ebenfalls nicht hin. Es wäre schön, wenn uns jemand helfen könnte und erklärt, wie denn nun eine Form aus einer DLL aufgerufen wird, die dynamisch geladen wird.

    Frohe Ostern...



  • Einfach mal auf meiner Seite stöbern ...



  • Hallo F98,
    danke für den Link. Sehr sehr gut, deine Seite. Da werd ich mir in der nächsten Zeit noch so manches "abgucken". Aber ich griegs immer noch nich hin die Dll zur Laufzeit einzubinden und ein Form anzuzeigen.
    Hier mal mein Code

    cpp der DLL:

    #include <vcl.h>
    #include <stdio.h>
    #include <windows.h>
    #include "unit2.h"
    #pragma hdrstop
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    extern "C" __declspec(dllexport) void FormShow();
    
    //---------------------------------------------------------------------------
    
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    
    void FormShow()
    {
    
    TDLLForm* DLLForm1 = new TDLLForm(0);
    DLLForm1->ShowModal();
    }
    

    .h der Exe

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TLabel *Label1;
            TButton *Button2;
            TButton *Button3;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            void __fastcall Button3Click(TObject *Sender);
    private:	// Anwender-Deklarationen
            HINSTANCE DllInstance; // Instanz auf die DLL deklarieren
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    cpp der Exe:

    #include <vcl.h>
    #pragma hdrstop
    #include "windows.h" // Wichtig!!
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        typedef void (__TFormShow* FormShow) ();
        DllInstance = LoadLibrary("Project2.dll"); //DLL wird bei Bedarf geladen.
    
        FormShow = (TFormShow)GetProcAddress(DllInstance, "_FormShow");
        FormShow();
    
    }
    

    Was mach ich blos noch falsch?
    Gruß Matthias



  • Die cpp der Exe sollte dann so aussehen:

    #include <vcl.h>
    #pragma hdrstop
    #include "windows.h" // Wichtig!!
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        typedef int (__stdcall *IMPFUNC) ();
        IMPFUNC DllFunktion;
    
        if (!DllInstance) DllInstance = LoadLibrary("Project2.dll"); // DLL laden
    
        if (DllInstance) // wenn die DLL geladen wurde
        {
           DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_FormShow"); // Funktion "Formshow" in der DLL raussuchen
    
           if (DllFunktion) // wenn die Funktion gefunden wurde
           {
              DllFunktion(); // Funktion ausführen, also Dein Fenster anzeigen
           }
    
           if (FreeLibrary(DllInstance)) DllInstance = NULL; // DLL wieder entladen!
        }
    }
    


  • Danke F98,

    mit Deinem Code-Beispiel (Button3) hab ich es jetzt endlich hingekriegt, die Form aus der DLL anzuzeigen.

    Schöne Ostertage...



  • Juergen Vogt schrieb:

    Danke F98,
    mit Deinem Code-Beispiel (Button3) hab ich es jetzt endlich hingekriegt, die Form aus der DLL anzuzeigen.
    Schöne Ostertage...

    Jo, ich auch 😉 🙂 🙂 !!!!!!!
    Danke
    Matthias



  • hab noch n Problem

    ich grieg zwar jetzt die Form geöffnet, aber beim Entladen der Dll bekomme ich eine Fehlermeldung "Zugriffsverletzung bei ... ". Das passiert aber nicht wenn ich die Dll lade und wieder entlade ohne die Form anzuzeigen. Muss mit der Zeile

    TDLLForm* DLLForm1 = new TDLLForm(NULL); // Form zur Laufzeit erzeugen
    

    in der Dll zusammenhängen.
    Gruß Matthias



  • hat sich erledigt - ich hatte nur vergesse die Form beim Schliessen zu vernichten.
    nochmal vielen Dank und schöne Ostern
    Matthias


Anmelden zum Antworten