Modularisierung von Projekten



  • 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.


Anmelden zum Antworten