Modularisierung von Projekten
-
Ich hab mir das Tutorial angeschaut, aber nichts gefunden, um Klassen aus einer DLL zu verwenden. Hat jemand noch einen Link zu einem Tutorial oder ein Beispiel, das er hier posten kann. Danke.
-
Hallo,
Hier ist noch ein Tutorial
http://fatman98.fa.funpic.de/builder_dll.php
-
Danke für die Posts. Ich hab jetzt ein Testprogramm geschrieben das leider nicht funktioniert. Hier ist der Code.
Eine DLL mit der cpp:
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop #include "dll.h" #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------- void DLLTest::Draw() { }und dem Header:
#ifndef _DLL_H #define _DLL_H #ifdef __DLL__ # define DLL_EXP __declspec(dllexport) #else # define DLL_EXP __declspec(dllimport) #endif class DLL_EXP DLLTest { public: DLLTest(); ~DLLTest(); void Draw(); }; #endif // _DLL_HDas Programm das die DLL nutzt hat den Code:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { DLLTest *myDll = new DLLTest; } //---------------------------------------------------------------------------und den Header:
//--------------------------------------------------------------------------- #ifndef MainH #define MainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "dll.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifAls Fehler bekomme ich:
[Linker Fehler] Unresolved external 'DLLTest::~DLLTest()' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\DLLCLASS\MAIN.OBJ
[Linker Fehler] Unresolved external 'DLLTest::DLLTest()' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\DLLCLASS\MAIN.OBJDie .lib Datei habe ich aber dem Main Projekt hinzugefügt.
Danke.
-
Wo sind denn die Definitionen vom Konstruktor und Destruktor von DLLTest?
Füg doch da mal einen Funktionsrumpf hinzu.
Ich würde auch die Definitionen deiner Klasse lieber in eine separate cpp packen.
-
Tja, das war der Grund. Danke.
-
Eine Frage hab ich noch. Und zwar wenn man mehrere Klassen in eine DLL packt, muss dann in jeder Klasse die Definition:
#pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; }stehen, oder genügt das in einer. Für was benötige ich diese eigentlich, ich erzeuge ja nicht explizit eine Instanzhandle?
-
Hallo
diese Funktion muß genau einmal in der DLL auftauchen.
Das wird zum Initialisieren der DLL ausgeführt, ist sozusagen der Einspringpunkt wie das int Main() in Programmen.bis bald
akari
-
Wie kann ich eine Klasse aus einer DLL in einer anderen DLL verwenden, auf beiden Seiten, d.h. jeweils eine Variable einer Klasse aus der anderen DLL.
#include "TestDLL.h" class TestDLL; class DLL_EXP DLLTest { public: DLLTest(); ~DLLTest(); TestDLL myTest; void Draw(); }; #include "DLLTest.h" class DLLTest; class DLL_EXP TestDLL { public: TestDLL(); ~TestDLL(); DLLTest myTest; void Draw(); };Einseitig funtionierts. So bekomme ich den Fehler:
[C++ Fehler] DLLTest.h(20): E2450 Undefinierte Struktur 'TestDLL'
-
Wenn die Klassen sich gegenseitig brauchen, wäre es vernünftig beide Klassen in eine dll zu packen. Wenn du jede Klasse in eine eigene dll packst, fördert das die Übersicht auch nicht gerade.
-
In dem Beispiel sinds nur zwei Klassen, aber in meinem Projekt sinds natürlich mehr. Dort habe ich aber gerade das Problem, ich möchte aber die Klassen nach Funktionalität trennen. Gibts hierfür keine Lösung, außer alles in eine DLL zu packen.
-
Klassen die sehr unterschiedliche Funktionen haben kann man schon in separate dlls stecken. Klassen die sich gegenseitig inkludieren gehören aber eigentlich nicht in diese Kategorie.
-
Eigentlich inkludieren sie sich nicht richtig, ich muss nur Ergebnisse hin und her geben. Wie sollte man das sonst machen.
-
Hallo
Der Austausch kann über ein Interface, wie eine dritte gemeinsame Klasse gemacht werden. Wichtig ist nur das es kein Circular Including gibt.
bis bald
akari
-
Allgemeine Frage: Sollte man generell alle Klassen im Header-File deklarieren? Ich habe manchmal das Gefühl den Überblick zu verlieren, wenn ich hier deklariere und dort benutze. Hat jemand einen Tip für die Praxis? Lauter Units- und Header Files oder ein langes Unit? Beim BCB5 kann man ja nicht Codeteile auf- und zuklappen.
-
Hallo
eine Aufteilung ist schon besser. Zum einen wird ja gerade deshalb der Code übersichtlicher, weil du eine getrennte Übersucht über die Definition der Klasse und deren Implementaion hast. Gerade wenn du mit mehreren Leuten an einen Projekt arbeitest oder eine Bibliothek für mehrere Projekte erstellst, willst du nämlich gar nicht wissen wie die einzelnen Teile einer Klasse implementiert sind, sondern einfach die Definition.
Außerdem ist es von der Compilezeit besser. Denn wenn du die Implementaion einer Klasse bei getrennten Datein änderst, muß nur diese neu kompiliert werden.Für die Übersicht kannst du ja den ClassExplorer benutzen.
bis bald
akari
-
Danke noch mal für die Tipps. Ich habe jetzt einigen Klassen ein Interface hinzugefügt, was das Ganze auch übersichtlicher macht.
Das gegenseitige Inkludieren funktioniert aber schon, ich habe nur beim Kopieren übersehen dass bei manchen Variablen keinen Pointer verwendet habe, wodurch der Compiler natürlich ein Problem bekommt, wenn er den Speicher resevieren will, aber noch nicht weiss wie die Klasse definiert ist.
Nochmals Danke.