Comment créer une classe à partir de dll (constructeur en dll)? (С ++) ou comment charger dynamiquement la classe à partir dll?Comment créer une classe à partir de dll (constructeur en dll)? (С ++)
Répondre
répondre à votre question strictement, vous devez ajouter une extern fonction « C » qui renvoie le résultat du constructeur:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
Ensuite, dans votre source, vous pouvez utiliser GetProcAddr sur « new_foo » pour appeler la fonction .
Vous devrez exporter une fonction de la DLL qui appelle le constructeur et retourner le nouvel objet. Essayez d'éviter d'utiliser des types C++ concrets comme 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 à jour peut présenter différemment std :: string, ce qui provoque une incompatibilité lors de l'exécution. C'est ce qui est à la base de COM, par exemple - un système de type limité et une fonction exportée standard pour obtenir des instances d'objets.
Tt semble que la source de la DLL n'est pas sous son contrôle. –
La source DLL est sous mon contrôle – SomeUser
Si la classe est destinée à être utilisée, elle devrait probablement déjà être compilée avec __declspec (dllexport), donc il suffit de convaincre le fichier d'en-tête de mettre __declspec (dllimport) dans le définition de classe. Sinon, vous pouvez toujours modifier le fichier d'en-tête vous-même. – JesperE
Vous devez déclarer votre classe à l'aide du mot clé __declspec(dllexport)
lors de la création de la DLL. Lorsque vous utilisez la DLL, la classe doit être déclarée avec __declspec(dllimport)
:
#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif
class DECLSPEC_CLASS MyClass
{
...
}
Lorsque la DLL est compilé, vous devez ajouter -DCOMPILING_DLL à la liste des defines. Lorsque vous utilisez la classe, vous devez établir un lien statique avec la DLL, c'est-à-dire transmettre la bibliothèque d'importation mydll.lib au programme principal.
Si vous souhaitez charger la DLL à l'exécution, vous devez avoir une fonction C dans la DLL qui crée un objet et le renvoie pour vous. Il n'existe aucun moyen de rechercher dynamiquement un constructeur dans une DLL (en utilisant GetProcAddress()).
Au lieu d'exporter toutes les méthodes de la classe en utilisant __declspec, vous pouvez également compter sur le fait que le compilateur peut invoquer des fonctions virtuelles via le vtable, 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();
}
interface/modèle d'usine est agréable, surtout si vous allez utiliser 'GetProcAddress' et géré manuellement .def exporte la table –
Puisque la mémoire est allouée dans la DLL, peut-être il devrait aussi y avoir une' freeSomClass (IPublicInterface *) 'juste pour Assurez-vous que la mémoire est libérée correctement? – Robert
Je pense que cette réponse est fausse et devrait être supprimée. Vous ne pouvez pas passer un objet polymorphe à travers une limite de plugin, sauf si le même compilateur est utilisé dans le plugin et l'application. –
- 1. Créer une DLL: Comment utiliser une DLL pour créer une nouvelle DLL?
- 2. Obtenir le nom d'une DLL à partir de la DLL
- 3. Importation dynamique d'une classe C++ à partir d'une DLL
- 4. Comment ajouter du code à une DLL lors de l'exécution
- 5. À partir .exe à partir de Visual C++ 2005 dll
- 6. Importer une classe de modèle explicitement instanciée à partir de dll
- 7. Créer une DLL (sans point d'entrée) à partir de la ligne de commande avec MSVC
- 8. Comment exporter une définition de struct à partir d'un C .dll natif pour l'utiliser en C#
- 9. Comment créer une DLL multi-plate-forme dans .net
- 10. Comment construire QTcore4.dll sans dépendance à MSVCx80.dll?
- 11. Utilisation d'un AppDomain pour instancier une classe dans une DLL
- 12. Singleton dans une DLL?
- 13. Comment savoir pourquoi ma DLL dépend de zlib1.dll?
- 14. WPF: Analyse XamlParseException à partir de UserControl dans .dll
- 15. Utilisez DLL en PHP?
- 16. Comment appeler une DLL Delphi de VB6
- 17. Comment créer une instance à partir d'une chaîne en C#?
- 18. Utilisation de NHibernate dans une DLL
- 19. Comment obtenir le chemin d'accès exécutable à partir d'une DLL gérée
- 20. Une DLL peut-elle appeler une DLL .NET?
- 21. ASP.NET licence une DLL
- 22. Comment appeler C# .dll à partir d'une application C++/CLI?
- 23. Comment compiler dll chargeable en tcl
- 24. convertir .dll.a à dll
- 25. Utilisation de DLL mixtes à partir de/clr: projets purs
- 26. Comment obtenir une pile complète à partir d'un exe/dll en mode mixte écrasé?
- 27. Comment désactiver une sortie de console .DLL?
- 28. Impossible de trouver DLL PInvoke 'sqlceme30.dll'
- 29. Comment appeler DLL à l'intérieur de Java?
- 30. Obtenir le code IL à partir du fichier binaire DLL
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 les sources – SomeUser