2008-09-21 31 views
13

Was ist die richtige Methode zum Importieren einer C++ - Klasse aus einer DLL? Wir verwenden Visual C++.Dynamisch Importieren einer C++ - Klasse aus einer DLL

Es gibt die dllexport/exports.def + LoadLibrary + GetProcAddress trifecta, aber es funktioniert nicht auf C++ - Klassen, nur C-Funktionen. Liegt das an C++ - Namensänderung? Wie mache ich das?

Antwort

2

Normalerweise deklariere ich eine Schnittstelle Basisklasse, verwenden Sie diese Erklärung in meiner Anwendung, dann verwenden Sie LoadLibrary, GetProcAddress, um die Factory-Funktion zu erhalten. Der Faktor gibt immer den Zeiger des Schnittstellentyps zurück.

Hier ist ein praktisches Beispiel, exporting an MFC document/view from a DLL, dynamisch

1

dllexport/Dllimport Arbeiten geladen, legen Sie sich vor Ihren Klassennamen in der Header-Datei und Sie sind gut zu gehen.

Normalerweise möchten Sie dllexport in der dll verwenden, und dllimport in der exe (aber Sie können einfach dllexport überall und es funktioniert, macht es 'richtig' macht es minimal schneller zu laden).

Offensichtlich ist das für die Link-Zeit-Kompilierung. Sie können die Linker-Direktive/delayload verwenden, um sie 'dynamisch' zu machen, aber das ist wahrscheinlich nicht das, was Sie von der Betreffzeile wollen.

Wenn Sie wirklich eine LoadLibrary-Format laden möchten, müssen Sie Ihre C++ - Funktionen mit "extern C" Wrapper umschließen. Das Problem liegt am Namen Mangling, Sie könnten den vollständig entstellten Namen eingeben und es würde funktionieren. Die Problemumgehungen bieten im Allgemeinen eine C-Funktion, die einen Zeiger auf die korrekte Klasse zurückgibt - COM funktioniert auf diese Weise, da es 4 C-Funktionen aus einer DLL exportiert, die zum Abrufen der Schnittstellenmethoden innerhalb des Objekts in der DLL verwendet werden .

12

Sie müssen die folgenden hinzuzufügen:

extern "C" 
{ 
... 
} 

vermeiden Funktion Mangeln.

Sie könnten das Schreiben zwei einfache C-Funktionen betrachten:

SomeClass* CreateObjectInstace() 
{ 
    return new SomeClass(); 
} 

void ReleaseObject(SomeClass* someClass) 
{ 
    delete someClass; 
} 

Mit nur die Funktionen verwenden, können Sie später hinzufügen/ändern Funktionalität Ihres Objektes erstellen/löschen. Dies wird manchmal als Factory bezeichnet.

+1

Sollten diese 'SomeClass' Namen Sternchen haben (d. H. Zeiger auf' SomeClass' sein)? –

2

Check out this question. Grundsätzlich gibt es zwei Möglichkeiten. Sie können die Klasse mit _dllexport markieren und dann mit der Importbibliothek verknüpfen, und die DLL wird automatisch geladen. Oder wenn Sie die DLL dynamisch selbst laden möchten, können Sie die Fabrikfunktion Idee verwenden, die @titanae vorgeschlagen

Verwandte Themen