Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.10.2008, 10:33

Klassen in dlls auslagern

hi @ all,

ich habe mich schon dumm und dusselig gegoogelt aber ich finde nicht das was ich suche.

zu meiner frage:

wie kann ich mehrere klassen in eine dll auslagern und wie kann ich dann darauf zugreifen?

bitte c++ :lol:

greez jan

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

11.10.2008, 10:44

Dafür gibts

C-/C++-Quelltext

1
2
__declspec( dllexport )
__declspec( dllimport ) 


Die Verwendung ist ganz einfach, du definierst für deine DLL ein Präprozessor-Definition (hier mal XYZ_EXPORT). Anhand dieser kannst du dann unterscheiden ob du die Klassen exportieren oder importieren willst:

C-/C++-Quelltext

1
2
3
4
5
#ifdef XYZ_EXPORT
#define XYZ_API __declspec( dllexport )
#else
#define XYZ_API __declspec( dllimport )
#endif


Je nachdem ob du nun deine DLL compilierst, oder die DLL-Header in deinem Projekt (dass das die DLL verwenden soll) hast steht hinter XYZ_API entweder der Hinweis zu exportieren oder zu importieren...

Eine Klasse ex/importierst du dann wie folgt:

C-/C++-Quelltext

1
2
3
4
class XYZ_API Image
{
  // ...

};


Beim compilieren der DLL wird daraus (automatisch):

C-/C++-Quelltext

1
2
3
4
class __declspec( dllexport ) Image
{
  //...

};


Willst du die Klasse in einem anderen Projekt importieren bindest du einfach die entsprechenden Header ins Projekt mit ein. Der Compiler erkennt, aufgrund fehlender XYZ_EXPORT Präprozessor-Definition, dass die Klasse importiert werden soll. Der Präprozessor löst den Code ja folgendermasen auf:

C-/C++-Quelltext

1
2
3
4
class __declspec( dllimport ) Image
{
  //...

};


Damit du die Klasse wirklich nutzen kannst musst du natürlich noch die entsprechende .lib linken (diese wird beim Compilieren der DLL erzeugt), entweder über die Projekteinstellungen. Oder, mit manchen Compilern gehts, per:

C-/C++-Quelltext

1
#pragma comment( lib, "deinelib.lib" )


direkt im Code.
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

11.10.2008, 11:27

Hier eine genaue Beschreibung ( allerdings nur für Funktionen ):

https://www.spieleprogrammierer.de/phpBB…opic.php?t=6200


Und hier noch ein Tut für dynamisches laden
( allerdings nur geeigned für sowas wie Plugins )

Für Funktionen:
https://www.spieleprogrammierer.de/phpBB…opic.php?t=8579

Und sogar für Klassen ;):
https://www.spieleprogrammierer.de/phpBB…opic.php?t=8632

4

12.10.2008, 13:50

danke für die antworten haben mich schonmal weiter gebracht :-). jetzt hab ich aber noch ne frage:

kann man klassen in einer dll auch so strukturieren das sie auf mehrere .h und .cpp verteilt sind und das man hinterher in der dll nur noch eine instanz der jeweiligen klasse zurück gibt?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

12.10.2008, 14:05

Nein, C++ unterstützt keine partiellen Klassen.
@D13_Dreinig

6

14.10.2008, 11:48

Zitat

kann man klassen in einer dll auch so strukturieren das sie auf mehrere .h und .cpp verteilt sind und das man hinterher in der dll nur noch eine instanz der jeweiligen klasse zurück gibt?

DLL .h und .cpp Dateien haben erstmal nichts direkt miteinander zu tun. Die Deklaration einer Klassen (kann man das so sagen?) kann nicht getrennt werden, da class ... {} ein Block ist. Die Definition der Methoden kann aber in mehreren .cpp Dateien erfolgen. Sollten dann aber gemeinsam in einer Datei gelinkt werden.

Werbeanzeige