2010-03-04 18 views
7

Ich möchte eine COM-DLL in meiner C++ - Bibliothek verwenden. Die Art und Weise ich gemustert es geht, ist die DLL-TLB-Datei #import, was ich auch tat:Wie COM Dll in meinem C++ Programm zu verwenden ist

#import "mycom.tlb" no_namespace 

Das Problem ist, ich weiß nicht recht, wo diese Erklärung zu platzieren. sollte es in der H-Datei oder der CPP-Datei sein? oder vielleicht die Datei stdafx.h? Ich habe versucht, es in die CPP-Datei zu legen, nur zum Testen.

in der H-Datei, die ich dieses Mitglied erklärt haben:

ILogicSecuredPtr m_pbLogic; 

(wo ILogicSecured ist die Schnittstelle I mit dll in meinem COM arbeiten wollen)

Dann habe ich diese im Konstruktor zu instanziiert die Schnittstelle:

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

(LogicSecured wo der Name des Objekts ist, das die Schnittstelle implementiert)

I

Im destructor hinzugefügt:

CoUninitialize(); 

Dies wird jedoch nicht kompilieren, egal wo ich versuche, die # Import Erklärung zu platzieren. es erkennt das ILogicSecured-Objekt einfach nicht. ich diesen Fehler in der H-Datei:

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

ich auch soll erwähnen, dass, wenn ich (in Visual Studio) F12 auf der ILogicSecuredPtr Erklärung, es mich auf die tlh Datei dauert nur gut. Also ich weiß es erkennt es.

Was mache ich hier falsch?

Vielen Dank. Roey

Antwort

3

Das Problem ist, dass, wenn der Compiler die .h-Datei analysiert, es die #import noch nicht gesehen hat. Da Ihr Projekt klein ist, sollten Sie #import in stdafx.h setzen.

Wenn Sie F12 drücken, verwendet Visual Studio Intellisence-Datenbankinformationen, die bei der Analyse aller Quellen in der Reihenfolge gebildet werden, die sich möglicherweise von der Kompilierreihenfolge unterscheidet. Es ist also ziemlich typisch, dass Intellisence weiß, wo etwas deklariert ist und der Compiler es nicht gleichzeitig kompiliert.

+0

Kann ich die Handlung ein wenig verdicken? Wenn ich versuche, die Datei #import in die Datei stdafx.h einzufügen, die m_pbLogic (__ uuidof (LogicSecured)); Stück Code kompiliert nicht, sagen Fehler 18 Fehler C2064: Begriff bewertet nicht zu einer Funktion, die 1 Argumente – Roey

+1

Das ist richtig - Sie versuchen, den Member Variablenkonstruktor im Konstruktor Körper aufrufen - das ist nicht erlaubt. Sie sollten stattdessen CreateInstance() - Methode des IWhatevertr verwenden. – sharptooth

+0

Danke für die schnelle Antwort. Können Sie mir bitte ein Beispiel geben, wie CreateInstance in meiner Situation aufgerufen wird? und wo es zu platzieren? – Roey

2

Was passiert, wenn Sie eine DLL oder TLB-Datei importieren, ist, dass der Präprozessor eine TLH- und eine TI-Datei generiert. Wenn die TLB stabil ist, könnten Sie auch die zwei Dateien generieren und den TLH-Header wie einen normalen Header enthalten.

Also die Antwort ist die #import, wo Sie den Header setzen würde, weil es in ein Include der TLH-Datei umgewandelt wird.

Ich benutze es auf folgende Weise, um mich unabhängig von der Position der MSADO15.dll und fügte die TLH-Datei zu meiner 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

Zusätzlich zu den Kompilierungsproblemen, die Sie haben, gibt es andere Probleme mit diesem Design.

Im Allgemeinen sollten C++ - Bibliotheken COM nicht für Threads initialisieren, die nicht erstellt werden. Dies kann einige böse, schwer zu debuggende Nebenwirkungen verursachen. Ziehen Sie in Betracht, die Schnittstellenspezifikation für Ihre Bibliothek zu aktualisieren, um anzugeben, dass für die Verwendung bestimmter Methoden oder Objekte COM initialisiert werden muss. Sie sollten auch das erforderliche Threading-Modell angeben (STA, Free).

Das sagte - die andere Sache, auf die Sie achten müssen, ist CoUnitialize() aufzurufen, bevor Ihr intelligenter Zeiger den Gültigkeitsbereich verlässt. Dies kann auch einige schwer zu debuggende Nebenwirkungen verursachen. Wenn Sie CoUnitialize() im Destruktor eines Objekts aufrufen, das einen COM-Smart-Zeiger enthält, müssen Sie den Zeiger explizit freigeben und trennen, bevor Sie CoUnitialize() aufrufen.

Viel Spaß!

Verwandte Themen