Importation dynamic d’une classe C ++ à partir d’une DLL

Quelle est la manière correcte d’importer une classe C ++ à partir d’une DLL? Nous utilisons Visual C ++.

Il y a le sortingfecta dllexport / exports.def + LoadLibrary + GetProcAddress, mais il ne fonctionne pas sur les classes C ++, mais uniquement sur les fonctions C. Est-ce dû à la gestion des noms C ++? Comment puis-je faire ce travail?

Vous devez append les éléments suivants:

extern "C" { ... } 

pour éviter les manœuvres de fonction.

vous pourriez envisager d’écrire deux fonctions C simples:

 SomeClass* CreateObjectInstace() { return new SomeClass(); } void ReleaseObject(SomeClass* someClass) { delete someClass; } 

En n’utilisant que ces fonctions, vous pouvez ensuite append / modifier des fonctionnalités de la création / suppression de votre object. Ceci est parfois appelé une usine.

A trouvé la solution sur http://www.codeproject.com/KB/DLL/XDllPt4.aspx

Merci pour vos efforts les gars et les filles

Je déclare normalement une classe de base d’interface, utilise cette déclaration dans mon application, puis utilise LoadLibrary, GetProcAddress pour obtenir la fonction de fabrique. Le facteur renvoie toujours le pointeur du type d’interface.

Voici un exemple pratique d’ exportation d’un document / vue MFC à partir d’une DLL , chargé dynamicment

Découvrez cette question . Fondamentalement, il y a deux façons. Vous pouvez marquer la classe en utilisant _dllexport, puis lier avec la bibliothèque d’importation et la DLL sera chargée automatiquement. Ou si vous voulez charger la DLL dynamicment vous-même, vous pouvez utiliser l’idée de la fonction par défaut suggérée par @titanae

dllexport / dllimport fonctionne, placez-le avant le nom de votre classe dans le fichier d’en-tête et vous êtes prêt à partir.

Typiquement, vous voulez utiliser dllexport dans la DLL et dllimport dans l’exe (mais vous pouvez simplement utiliser dllexport partout et cela fonctionne, le faire correctement accélère le chargement).

De toute évidence, c’est pour la compilation du temps de liaison. Vous pouvez utiliser la directive / delayload linker pour la rendre «dynamic», mais ce n’est probablement pas ce que vous voulez de la ligne d’object.

Si vous voulez vraiment un chargement de style LoadLibrary, vous devrez envelopper vos fonctions C ++ avec des wrappers “extern C”. Le problème est dû à la manipulation de noms, vous pouvez taper le nom complet et cela fonctionnerait.

Les solutions de contournement consistent généralement à fournir une fonction C qui renvoie un pointeur sur la classe correcte – COM fonctionne de cette façon, car il exporte 4 fonctions C à partir d’une DLL utilisée pour obtenir les méthodes d’interface à l’intérieur de l’object dans la DLL.