Comment créer une DLL COM dans Visual Studio 2008?
Depuis des lustres, depuis que j'ai écrit une dll COM. J'ai fait une couple de classes aujourd'hui, qui héritent de certaines interfaces COM, mais je veux le tester. Je sais que je dois mettre un GUID quelque part et puis l'enregistrer avec regsvr32, mais quelles sont les étapes?
Edit: Désolé, j'ai oublié de mentionner que je suis à l'aide de C++.
OriginalL'auteur Mark Ingram | 2009-01-21
Vous devez vous connecter pour publier un commentaire.
Pour créer un nouveau COM ATL projet, vous pouvez procéder comme suit:
Vous avez créé une nouvelle dll, mais il est vide, pour ajouter un objet COM vous pouvez faire ceci:
Si vous voulez qu'un objet de mettre en œuvre une interface
PS: Il est beaucoup plus facile de créer un nouveau projet ATL avec le même nom dans un autre dossier, et d'ajouter les fichiers que vous avez personnalisé. L'assistant effectue plusieurs tâches et de créer plusieurs fichiers personnalisés.
Pour les grands projets qui sont difficiles à ajouter un fichier par fichier, je fais la même chose mais au lieu d'ajouter mes fichiers sur le nouveau projet que j'ai commencer à copier les paramètres de l'un des nouveaux projets de l'ancien, et d'ajouter un fichier supplémentaire que l'assistant a créé et la fixation des en-têtes comme stdafx.h à fusionner les nouveaux paramètres.
PPS: Si vous voulez que votre fichier dll pour soutenir les MFC, au lieu de sélectionner le Projet ATL, vous devez sélectionner MFC/MFC Dll. Lorsque vous ajoutez de l'ATL Simple Objet l'assistant vous demande d'ajouter la prise en charge ATL pour le projet.
OriginalL'auteur Ismael
Vous devez écrire une fonction appelée DllGetClassObject et de l'exporter. Cette fonction est responsable de l'attribution d'une "fabrique de classe", vous avez également à écrire, et qui est à son tour capable de répartir les instances de votre objet COM. Il a à mettre en œuvre IClassFactory.
Il n'est pas trop dur à faire. L'alternative est d'utiliser ATL (voir xhantt de réponse) qui, en théorie, fait cela pour vous, mais dans la pratique c'est un véritable gâchis. D'une certaine manière, il parvient à résumer la complexité de la COM à l'intérieur d'une couche d'abstraction qui est encore plus compliqué. Bonne chance en essayant de déplacer un objet entre les Dll par exemple.
Mais vous pouvez exécuter l'assistant ATL juste pour voir un exemple de comment déclarer
DllGetClassObject
. La mise en œuvre deIClassFactory
est très simple: il suffit d'une méthode de news-un objet.Ensuite, vous devez enregistrer votre DLL - c'est à dire mettre les clés dans le registre. Le
regsvr32
outil ne peut le faire sans l'aide auprès de vous. Vous avez à écrire et à exporter une autre fonction appelée DllRegisterServer, qui fait tout le travail dur. Tout ce queregsvr32
n'est de charger la DLL, de rechercherDllRegisterServer
et de l'appeler.De nouveau, ATL a une façon de mettre en œuvre ce pour vous, mais il le fait par la lecture d'un type de script complet de registre instructions de modification, de stocker dans un .fichier rgs qui est ancrée dans votre DLL de ressources. Si vous avez accidentellement mis tout type d'erreur de syntaxe dans ce fichier, l'enregistrement échoue silencieusement.
Donc encore une fois, vous pouvez effectivement trouver qu'il est plus simple d'écrire quelques lignes de code pour régler le registre vous-même. Voici les détails.
Si vous avez utilisé le C# au lieu de cela, vous n'avez aucun de ces problèmes. Tout est encapsulé très proprement. Il fonctionne beaucoup mieux que le C++ comme un outil de développement des objets COM.
OriginalL'auteur Daniel Earwicker
Lorsque vous générez la solution, il enregistre automatiquement la dll.
Et aussi il crée deux fichiers _i.c et .h fichier.
Pour tester la dll créer l'exemple d'application:
Créer des exemples d'applications Win32. Inclure le _i.c et .h dans le fichier cpp de l'application win32 qui a pour fonction principale
Appel CoInitialize();
Déclarer un pointeur d'interface
CComPtr pMyInterface = NULL; //où IMyInterface est déclaré dans _i.c
Créer l'instance
pMyInterface.CoCreateInstance(CLSID_MyClass); //CLSID_MyClass est GUID représentant l'
Coclasse
Appel de l'Api présents dans l'Interface
Appel CoUnInitialize();
Vous pouvez consulter le lien suivant codeproject.com/script/Articles/MemberArticles.aspx?amid=88625
OriginalL'auteur Vinay