Как использовать COM DLL в моей программе на C ++

Я хочу использовать COM DLL в моей библиотеке C ++. То, как я решил, это импортировать файл .tlb dll, что я и сделал:

#import "mycom.tlb" no_namespace

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

в H-файле, который я объявил этому члену:

ILogicSecuredPtr m_pbLogic;

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

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

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. Так что я знаю, что это признает.

Что я здесь не так делаю?

Большое спасибо. Рой

7
задан VividD 25 November 2014 в 17:09
поделиться

3 ответа

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

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

3
ответ дан 7 December 2019 в 10:00
поделиться

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

Итак, ответ помещен в #import, где вы поместили бы заголовок, потому что он конвертируется во включение файла 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
2
ответ дан 7 December 2019 в 10:00
поделиться

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

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

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

Удачи!

1
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: