2010-03-04 3 views
7

Я хочу использовать COM-библиотеку COM в своей библиотеке C++. Как я фигурный идти об этом, чтобы #import .tlb файл в библиотеки DLL, который я сделал:Как использовать COM-dll в моей программе на C++

#import "mycom.tlb" no_namespace 

Проблема заключается в том, я даже не знаю, куда поместить эту декларацию. если он находится внутри файла H или файла CPP? или, может быть, файл stdafx.h? Я попытался поместить его в файл .cpp, просто для тестирования.

в H файл я объявил этот член:

ILogicSecuredPtr m_pbLogic; 

(где ILogicSecured является интерфейсом я хочу работать в моей DLL COM)

Затем я добавил это в конструктор для создания экземпляра интерфейс:

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

(где LogicSecured это имя объекта, который реализует интерфейс)

В деструкторе я добавил:

CoUninitialize(); 

Это не будет компилироваться, однако, независимо от того, где я пытаюсь поместить объявление #import. он просто не распознает объект ILogicSecured. Я получаю эту ошибку в файле H:

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

Я должен также упомянуть, что, когда я f12 (в Visual Studio) об объявлении ILogicSecuredPtr, он принимает меня в файл TLH просто отлично. Поэтому я знаю, что это признает.

Что я здесь делаю неправильно?

Спасибо большое. Roey

ответ

3

Проблема в том, что когда компилятор анализирует файл .h, он еще не видел #import. Так как ваш проект небольшой, лучше всего поставить #import в stdafx.h.

При нажатии F12 Visual Studio использует информацию базы данных Intellisence, которая формирует синтаксический анализ всех источников, чтобы они отличались от порядка компиляции. Поэтому довольно типично, что Intellisence знает, где что-то объявлено, и компилятор не компилирует его в одно и то же время.

+0

Могу ли я сгустить участок немного? Если я попытаюсь добавить #import в файл stdafx.h, то m_pbLogic (__ uuidof (LogicSecured)); Код не компилируется, говоря Ошибка 18 ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент – Roey

+1

Правильно - вы пытаетесь вызвать конструктор переменных-члена внутри тела конструктора - это недопустимо. Вместо этого вы должны использовать метод CreateInstance() для IWhateverPtr. – sharptooth

+0

Спасибо за быстрый ответ. Можете ли вы дать примерный пример того, как вызвать CreateInstance в моей ситуации? и где его разместить? – Roey

2

Что произойдет, если вы импортируете файл dll или tlb, это то, что препроцессор генерирует файл tlh и tli. Если tlb стабилен, вы также можете сгенерировать два файла и включить заголовок tlh, как если бы он был обычным заголовком.

Таким образом, ответ помещается в #import, куда вы поместите заголовок, потому что он преобразуется в include файла tlh.

Я использую его следующим образом, чтобы сделать себя независимым от местоположения файла MSADO15.dll и добавить файл tlh в мою подрывную деятельность.

#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

В дополнение к вопросам компиляции, которые возникают у вас, есть и другие проблемы с этим дизайном.

Как правило, библиотеки C++ не должны инициализировать COM на потоках, которые он не создает. Это может вызвать некоторые неприятные, трудно отлаживающие побочные эффекты. Попробуйте обновить спецификацию интерфейса для вашей библиотеки, чтобы указать, что использование определенных методов или объектов требует инициализации COM. Вы также должны указать требуемую модель потоковой передачи (STA, Free).

Сказанное - другое, что вам нужно, чтобы следить за вызовом CoUnitialize(), прежде чем ваш умный указатель выходит за рамки. Это также может вызвать некоторые отлаженные побочные эффекты. Если вы вызываете CoUnitialize() в деструкторе объекта, который содержит интеллектуальный указатель COM, вам нужно явно освободить и отделить указатель до вызова CoUnitialize().

Удачи!

Смежные вопросы