Question

Quelle est la bonne façon d'importer une classe C ++ à partir d'une DLL? Nous utilisons Visual C ++.

Il existe le trifecta dllexport / exports.def + LoadLibrary + GetProcAddress, mais il ne fonctionne pas sur les classes C ++, mais uniquement sur les fonctions C. Est-ce dû à un changement de nom en C ++? Comment puis-je faire ce travail?

Était-ce utile?

La solution 2

Vous avez trouvé la solution à l'adresse http://www.codeproject.com/KB/DLL/. XDllPt4.aspx

Merci pour vos efforts, les gars & amp; les filles

Autres conseils

Vous devez ajouter les éléments suivants:

extern "C"
{
...
}

pour éviter les mutilations de fonctions.

vous pourriez envisager d'écrire deux fonctions simples en C:

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

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

En utilisant uniquement ces fonctions, vous pouvez ensuite ajouter / modifier les fonctionnalités de création / suppression d’objets. Ceci est parfois appelé une usine.

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, exportation d'un document / vue MFC à partir d'une DLL , chargé dynamiquement

Découvrez cette . Fondamentalement, il y a deux façons. Vous pouvez marquer la classe à l'aide de _dllexport, puis établir un lien avec la bibliothèque d'importation et la DLL sera chargée automatiquement. Ou, si vous souhaitez charger vous-même la DLL de manière dynamique, vous pouvez utiliser l'idée de fonction d'usine proposée par @titanae

.

dllexport / dllimport fonctionne, placez-le devant 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 le fichier exe (mais vous pouvez simplement utiliser dllexport partout et cela fonctionne, le fait de le faire "à droite" accélère considérablement le chargement).

Évidemment, c'est pour la compilation en temps de lien. Vous pouvez utiliser la directive / delayload linker pour la rendre 'dynamique', mais ce n'est probablement pas ce que vous voulez dans la ligne de sujet.

Si vous voulez vraiment un chargement de style LoadLibrary, vous devrez envelopper vos fonctions C ++ avec "extern C". emballages. Le problème vient du fait que le nom a été mélangé, vous pouvez taper le nom complètement mutilé 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 manière, car il exporte 4 fonctions C à partir d'une dll utilisée pour obtenir les méthodes d'interface à l'intérieur de l'objet dans la dll.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top