2009-06-24 6 views
5

Betrachten Sie mich als Anfänger zu Windows-Umgebung und COM-Programmierung.COM-Automatisierung mit Tlb-Datei

Ich muss einen Anwendung (CANoe) Zugriff automatisieren. CANoe stellt sich als COM-Server zur Verfügung und stellt die Dateien CANoe.h, CANoe_i.c und CANoe.tlb zur Verfügung. Kann jemand angeben, wie man einen C++ - Client schreibt, um auf das Objekt zuzugreifen, Funktionen der Anwendung.

Geben Sie auch an, wie auf den in der tlb-Datei vorhandenen Code aus C++ zugegriffen werden soll.

Antwort

9

Visual Studio verfügt über eine umfangreiche Unterstützung für das Importieren von Typbibliotheken in Ihr C++ - Projekt und die Verwendung der so definierten Objekte. Zum Beispiel können Sie die #import Direktive verwenden:

#import "CANoe.tlb" 

Dies wird die Typenbibliothek importieren und konvertieren es Dateien und Implementierungsdateien auf Header - auch wird es die Implementierungsdateien verursachen, mit Ihrem Projekt und dem Header gebaut werden Dateien, die enthalten sein sollen, das sind also viele magische Sachen.

Dann erhalten Sie eine Vielzahl von typedefs für Smart-Pointer-Wrapper für die Typen und Objekte in der Typbibliothek definiert. Zum Beispiel genannt Application wenn es eine Co-Klasse war, die die Schnittstelle implementiert IApplication, können Sie dies tun:

ApplicationPtr app(__uuidof(Application)); 

Die zur Laufzeit verursachen würde, die Co-Klasse-Anwendung erstellt und an die Variable app, und Sie gebunden sein kann wie so weiter nennen:

app->DoSomeCoolStuff(); 

Fehlerbehandlung durch Überprüfung des Ergebnisses der COM-Anrufe, und werfen Sie die entsprechende _com_error Ausnahme als notwendig, so bedeutet dies, Sie Ausnahme schreiben müssen sicher durchgeführt wird.

1

Verwenden Sie import Direktive, um die TLB-Datei zu importieren - das wird Ihnen ein C++ - Äquivalent der Schnittstellen geben, die von der COM-Komponente verfügbar gemacht werden.

Sie müssen auch die COM-Komponente in der Registrierung registrieren (führen Sie Regsvr32 für die DLL-Datei der Komponente). Danach können Sie CoCreateInstance() (oder _com_ptr_t :: CreateInstance(), wie es normalerweise bequemer ist) aufrufen, um eine Instanz der Klasse zu erzeugen, die die Schnittstelle implementiert. Sie können dann Methoden der Schnittstelle aufrufen - sie wird fast genauso funktionieren, als ob es eine einfache C++ - Schnittstelle und -Klasse wäre.

+0

Vielen Dank an alle für die schnelle Antwort. Ich habe nicht die DLL-Datei für die Anwendung, wird also diesen Ansatz bevorzugen. Erhalte folgende Kompilierungsfehler, nach #import "CANoe.tlb" in meiner Quelldatei. - unbekanntes Zeichen '0x1' - Syntaxfehler: fehlt ';' vor Kennung 'A' - fehlender Typspezifizierer - int angenommen. Hinweis: C++ unterstützt nicht default-int - '{': fehlende Funktion Header (alte formale Liste?) Bitte schlagen Sie vor, wenn ich einen Schritt vermisse. Gibt es eine Möglichkeit, den Inhalt der TLB-Datei zu überprüfen und diese Fehler zu beheben. Vielen Dank im Voraus –

+0

Ich schlage vor, Sie versuchen, es zu lösen, und wenn Sie es nicht schaffen, nur eine separate Frage stellen, die genügend Details zur Verfügung stellt. – sharptooth

0

Der einfachere Weg ist, beide .h und _i.c-Projekt in Ihre CPP-Datei mit #include Anweisungen aufzunehmen.

Da Sie nicht die DLL gegeben haben und nur tlb zur Verfügung gestellt wird, können Sie die tlb mit regtlibv12.exe registrieren, die ein Teil von Visual Studio ist (das ist die VS2005-Version). Durch die Registrierung von tlb werden entsprechende Einträge in der Registrierung vorgenommen und Sie können die COM-Bibliotheksfunktionen nach Bedarf verwenden.

EDIT: BTW, Sie benötigen DLL trotzdem, um die COM-Komponente erfolgreich instanziieren.

einen Schnittstellenzeiger zu erstellen, eine des sichereren Weges ist CComPtr zu verwenden wie:

 

CComPtr myPtr; 
myPtr.CoCreateInstance(__uuidof("ClassNamehere")); 
myPtr->Method(....); 

 
+0

Wenn er die DLL nicht hat, kann er die Komponente nicht instanziieren und sein Client-Programm debuggen. – sharptooth

+0

Ja, aber es ist durchaus möglich, dass die TLB-Datei nur Schnittstellendefinitionen enthält und separat registriert werden muss. Sie haben Recht mit DLL, dass er es haben sollte, um die Komponente zu instanziieren. – Aamir

+0

Nun, Sie haben Recht, separate TLB-Registrierung möglich ist. Aber es ist ein letzter Ausweg Übung in der Regel verwendet, wenn die COM-Komponente hat unvollständige COM-Unterstützung und unterstützt nicht DllRegisterServer und DllGetClassObject. – sharptooth