Автоматизация COM с использованием файла tlb - PullRequest
5 голосов
/ 24 июня 2009

Считай меня новичком в среде Windows и программировании COM.

Я должен автоматизировать доступ к приложению (CANoe). CANoe представляет себя как COM-сервер и предоставляет файлы CANoe.h, CANoe_i.c и CANoe.tlb. Может кто-нибудь указать, как написать клиент C ++, для доступа к объекту, функциям приложения.

Также, пожалуйста, укажите, как получить доступ к коду, присутствующему в файле tlb, из C ++.

Ответы [ 3 ]

9 голосов
/ 24 июня 2009

Visual Studio имеет много встроенной поддержки для импорта библиотек типов в ваш проект C ++ и использования определенных таким образом объектов. Например, вы можете использовать директиву #import:

#import "CANoe.tlb"

Это импортирует библиотеку типов и преобразует ее в заголовочные файлы и файлы реализации - также это приведет к тому, что файлы реализации будут скомпонованы с вашим проектом, а файлы заголовков включены, так что тут много волшебства .

Затем вы получаете множество typedef для умных оболочек указателей для типов и объектов, определенных в библиотеке типов. Например, если существует CoClass с именем Application, который реализует интерфейс IApplication, вы можете сделать это:

ApplicationPtr app(__uuidof(Application));

Это приведет к тому, что во время выполнения будет создано приложение coclass и привязано к переменной app, и вы можете вызвать его следующим образом:

app->DoSomeCoolStuff();

Обработка ошибок выполняется путем проверки результата COM-вызовов и выдачи соответствующего исключения _com_error по мере необходимости, что подразумевает, что вам нужно безопасно написать исключение.

1 голос
/ 24 июня 2009

Используйте директиву import для импорта файла .tlb - это даст вам C ++ эквивалент интерфейсов, предоставляемых компонентом COM.

Вам также необходимо зарегистрировать COM-компонент в реестре (запустите regsvr32 в файле .dll компонента). После этого вы можете вызвать CoCreateInstance () (или _com_ptr_t :: CreateInstance (), как это обычно более удобно), чтобы создать экземпляр класса, реализующего интерфейс. Затем вы можете вызывать методы интерфейса - он будет работать почти так же, как если бы это был простой интерфейс C ++ и класс.

0 голосов
/ 24 июня 2009

Более простой способ - включить оба проекта .h и _i.c в файл .cpp, используя операторы #include .

Поскольку вы не получили dll, и предоставляется только tlb, вы можете зарегистрировать tlb, используя regtlibv12.exe, который является частью visual studio (это версия VS2005). Зарегистрировав tlb, в реестр будут внесены соответствующие записи, после чего вы сможете использовать функции библиотеки COM по своему усмотрению.

РЕДАКТИРОВАТЬ: Кстати, вам все равно нужна DLL для успешного создания экземпляра COM-компонента.

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


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


...