Klasse aus DLL exportieren
-
Hallo Community,
ich versuche derzeitig, eine Klasse aus einer DLL zu exportieren und sie dann in meiner eigentlichen Anwendung wieder zu importieren.
Wie man einfache Funktionen in einer DLL mittels .def-File exportiert ist mir bekannt und das funktioniert auch.
Mein .def-File sieht so aus:
EXPORTS NewVehicle @1 DeleteVehicle @2Die beiden Funktionen sind globale Funktionen.
In meiner eigentlichen Anwendung versuche ich jetzt über LoadLibrary und GetProcAddress zunächst die globalen Funktionen aufzurufen. Das funktioniert, wie gesagt.
Sobald ich aber versuche, eine Memberfunktion des mittels NewVehicle instanziierten Objektes in meiner eigentlichen Anwendung aufzurufen, sagt der Linker mir, dass er die Funktion nicht finden kann. Wie gebe ich die Klasse bzw. die Member-Funktionen im .def-File an?
Vielen Dank im Voraus! VG, '][' !
-
Hallo Tanta,
die Methoden von Klassen werden vom Compiler intern anders benannt ( sog. name mangling / name decoration ) um das Überladen von Methoden hinzubekommen. Der interne Funktionsname beinhaltet neben dem eigentlichen Namen noch Parametertypen und sonstige Infos ( Konstruktoren, ... ).
Bsp.:
class CDispParams { // ... VARIANTARG* GetPositionalParam( UINT nParam ); COleVariant GetPositionalParam( UINT nParam, VARTYPE vtConv ); };Die Methoden werden vom Compiler intern wie folgt genannt:
?GetPositionalParam@CDispParams@@QAEPAUtagVARIANT@@I@Z ?GetPositionalParam@CDispParams@@QAE?AVCOleVariant@@IG@ZDie Namen kannst du im Map-File nachschauen oder mit dem Tool DUMPBIN /SYMBOLS in den Object-Files extrahieren.
Wenn du diese Methoden exportierst, kannst du auch den Aufruf der Methoden außerhalb der dll implementieren. Damit du dich aber nicht um die komische Schreibweise kümmern musst, unterstützen manche Compiler das Exportieren von Klassen und Methoden mit speziellen Schlüsselwörtern. Der Eintrag in das DEF-File ist damit nicht mehr notwendig. Für die Microsoft C++ Compiler gibt es die Schlüsselwörter
__declspec(dllexport) __declspec(dllimport)Damit lässt sich eine Klasse mit allen Methoden z.B. wie folgt exportieren:
class __declspec(dllexport) CDispParams { // ... VARIANTARG* GetPositionalParam( UINT nParam ); COleVariant GetPositionalParam( UINT nParam, VARTYPE vtConv ); };Dokumentation hierzu findest du in der MSDN unter http://msdn2.microsoft.com/de-de/library/a90k134d(VS.80).aspx
Gruß
tvdog