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 Codecpp 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