9
votes

Comment créer une classe de la DLL (constructeur en DLL) en C ++?

Comment créer une classe de la DLL (constructeur dans la DLL)? (C ++) ou comment charger de manière dynamique la classe de la DLL?


2 commentaires

Avez-vous un fichier d'en-tête correspondant et / ou un fichier de bibliothèque pour accéder à la DLL?


oui j'ai mon en-tête et mes sources


4 Réponses :


3
votes

Vous devrez exporter une fonction de la DLL qui appelle au constructeur et renvoie le nouvel objet.

Essayez d'éviter d'utiliser des types C ++ concrets en tant que paramètres de fonction; L'idée des DLL est que vous pouvez les mettre à jour de manière indépendante, mais un compilateur mis à niveau peut poser STD :: String différemment, provoquant une incompatibilité au moment de l'exécution.

C'est ce qui est à la racine de COM, par exemple - un système de type limité et une fonction standard exportée pour obtenir des instances d'objets.


3 commentaires

TT sonne comme si la source de la DLL n'est pas sous son contrôle.


La source DLL est sous mon contrôle


Si la classe est destinée à être utilisée, elle devrait probablement être déjà compilée avec __declSpec (Dllexport), alors il ne s'agit que d'une question de convaincre le fichier d'en-tête de mettre __declspec (Dllimport) dans la définition de la classe. Sinon, vous pouvez toujours modifier vous-même le fichier d'en-tête.



10
votes

Vous devez déclarer votre classe en utilisant le mot-clé __ DeclSpec (dllexport) lors de la construction de la DLL. Lorsque vous utilisez la DLL, la classe doit être déclarée avec __ DeclSpec (dllimport) : xxx

lorsque la DLL est compilée, vous devez ajouter -dcelliling_dll vers la liste de Définit.

Lorsque vous utilisez la classe, vous devez créer un lien entre statiquement avec la DLL, c'est-à-dire passer la bibliothèque d'importation mydll.lib au programme principal.

Si vous souhaitez charger la DLL < Strong> au runtime , vous devez avoir une fonction C dans la DLL qui crée un objet et le retourne pour vous. Il n'y a aucun moyen de rechercher un constructeur de manière dynamique dans une DLL (à l'aide de GetProcAddress ()).


1 commentaires

Pouvez-vous citer une source pour la dernière déclaration? AFAIK A CORT a un nom mangelé et vous pouvez appeler GetProcAddRESS en utilisant ce nom. Qu'est-ce qui vous arrêterait?



3
votes

Répondre strictement de votre question, vous devez ajouter une fonction externe "c" qui renvoie le résultat du constructeur: xxx

puis dans votre source, vous pouvez utiliser getProcAddr sur "new_foo" pour Appelez la fonction.


0 commentaires

3
votes

Au lieu d'exporter toutes les méthodes de la classe à l'aide de __declSpec, vous pouvez également compiler sur le fait que le compilateur peut invoquer des fonctions virtuelles via la table équipée, donc par exemple:

//note: no __declspec
class IPublicInterface
{
  virtual ~IPublicInterface() = 0;
  virtual void SomeMethod() = 0;
};

//note: no __declspec
class SomeClass : IPublicInterface
{
  virtual ~SomeClass() { ... }
  virtual void SomeMethod() { ... }
};

//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
  return new SomeClass();
}


3 commentaires

L'interface / modèle d'usine est agréable, surtout si vous allez utiliser getProcAddress et géré manuellement .de exportations de.


Étant donné que la mémoire est allouée dans la DLL, il devrait également y avoir un freesomclass (ipublicinterface *) juste pour vous assurer que la mémoire est libérée correctement?


Je pense que cette réponse est fausse et devrait être supprimée. Vous ne pouvez pas transmettre un objet polymorphique sur une limite de plug-in, sauf lorsque le même compilateur est utilisé à la fois dans le plugin et à l'application.