2010-03-04 10 views
7

Je souhaite utiliser une dll COM dans ma bibliothèque C++. La façon dont je me suis dit d'aller à ce sujet, est de #import fichier .tlb du dll, ce que je fis:Comment utiliser dll COM dans mon programme C++

#import "mycom.tlb" no_namespace 

Le problème est, je ne sais pas tout à fait où placer cette déclaration. devrait-il être dans le fichier H ou le fichier CPP? ou peut-être le fichier stdafx.h? J'ai essayé de le placer dans le fichier .cpp, juste pour tester.

dans le fichier H je ce membre a déclaré:

ILogicSecuredPtr m_pbLogic; 

(où ILogicSecured est l'interface que je veux travailler dans mon dll COM)

Puis j'ajouté ce dans le constructeur pour instancier l'interface:

CoInitialize(NULL); 
m_pbLogic(__uuidof(LogicSecured)); 

(où LogicSecured est le nom de l'objet qui implémente l'interface)

Dans le destructor j'ajouté:

CoUninitialize(); 

Cela ne compilera pas cependant, peu importe où je tente de placer la déclaration de #import. il ne reconnaît tout simplement pas l'objet ILogicSecured. Je reçois cette erreur dans le fichier H:

Error 2 error C2146: syntax error : missing ';' before identifier 'm_pbLogic' 

Je dois mentionner aussi que quand je F12 (dans Visual Studio) sur la déclaration ILogicSecuredPtr, il me faut au fichier TLH très bien. Donc je sais que ça le reconnaît.

Qu'est-ce que je fais mal ici?

Merci beaucoup. Roey

Répondre

3

Le problème est que lorsque le compilateur analyse le fichier .h, il n'a pas encore vu le #import. Puisque votre projet est petit, votre meilleur pari est de mettre #import dans stdafx.h.

Lorsque vous appuyez sur F12 Visual Studio utilise les informations de base de données Intellisence qui est formée de toutes les sources analyse pas afin que pourrait être différent de l'ordre de compilation. Il est donc assez courant que Intellisence sache où quelque chose est déclaré et que le compilateur ne le compile pas en même temps.

+0

Si j'essaye d'ajouter le #import dans le fichier stdafx.h, le m_pbLogic (__ uuidof (LogicSecured)); le code ne compile pas, en disant erreur 18 erreur C2064: terme n'évalue pas à une fonction prenant 1 arguments – Roey

+1

C'est vrai - vous essayez d'appeler le constructeur de variable membre dans le corps du constructeur - ce n'est pas autorisé. Vous devez utiliser la méthode CreateInstance() de l'IWhateverPtr à la place. – sharptooth

+0

Merci pour la réponse rapide. Pouvez-vous donner un exemple de comment appeler CreateInstance dans ma situation? et où le placer? Merci – Roey

2

Que se passe si vous importez un fichier dll ou TLB est que le préprocesseur génère un TLH et un fichier TLI. Si le TLB est stable, vous pourrait également générer deux fichiers et comprennent l'en-tête de TLH comme si son un en-tête normal.

La réponse est donc mis le #import où vous mettriez l'en-tête parce qu'il est converti en un include du fichier TLH.

Je l'utilise de la manière suivante pour me rendre indépendant de l'emplacement du MSADO15.DLL et a ajouté le fichier TLH à ma subversion.

#ifndef __ADO__H 
#define __ADO__H 

#ifdef REBUILD_ADO_HEADER 
#import "C:\Programme\Gemeinsame Dateien\system\ado\MSADO15.DLL" rename_namespace("MyAdoNamespace") rename("EOF","EndOfFile") 
#else // REBUILD_ADO_HEADER 
#include "MSADO15.tlh" 
#endif // REBUILD_ADO_HEADER 

// Define ADO Namespace as global 
using namespace MyAdoNamespace; 

#endif // __ADO__H 
1

En plus des problèmes de compilation que vous rencontrez, il existe d'autres problèmes avec cette conception.

Généralement, les bibliothèques C++ ne doivent pas initialiser COM sur les threads qu'il ne crée pas. Cela peut provoquer des effets secondaires désagréables et difficiles à déboguer. Envisagez de mettre à jour la spécification d'interface de votre bibliothèque pour indiquer que l'utilisation de certaines méthodes ou objets nécessite l'initialisation de COM. Vous devez également spécifier le modèle de thread requis (STA, Free). Cela dit - l'autre chose que vous devez surveiller est d'appeler CoUnitialize() avant que votre pointeur intelligent ne soit hors de portée. Cela peut également causer des effets secondaires difficiles à déboguer. Si vous appelez CoUnitialize() dans le destructeur d'un objet qui contient un pointeur intelligent COM, vous devez explicitement libérer et détacher le pointeur avant d'appeler CoUnitialize().

Amusez-vous! Puis-je épaissir l'intrigue un peu?

Questions connexes