VC++ COM Использовать библиотеку типов приложения

stm7893611

Появилось задание разобраться в чужой библиотеке и подправить чуток, в итоге перечитал пару статей по COM но встал на одном моменте:
не получается воспользоваться type library другого приложения
Подключаю библиотеку типов следующим образом:
#import "c:\projects\rgb\rgb.siebelcti\CCAconnect2\CCA.tlb"
создает tlh файл в папке debug, но в class view проекта нет новых типов.
Если же попытаться использовать например тип
IApplicationPtr app_CCA;
(не совсем понял, как этот тип получается из IApplication, как-то так:
_COM_SMARTPTR_TYPEDEF(IApplication, __uuidof(IApplication;)
так вот в этом случае всё работает, и даже работает
HRESULT hr = app_CCA.CreateInstance("CCA.Application");
что вызывает загрузку приложения при загрузке самой библиотеки
когда набираешь app_CCA->
даже выскакивает подсказка со всеми нужными функциями, которые я и хочу использовать, однако если попытаться вызвать любую из этих функций, например
app_CCA->GetLine;
то вылезает ошибка
error C2039: 'GetLine' : is not a member of 'IApplication'
Пробовал подключать tlh файл к проекту - не помогает.

kokoc88

но в class view проекта нет новых типов
Программа под MFC? Попробуй импортировать библиотеку типов через class wizard.

stm7893611

Не, не на MFС судя по всему... говорит, что классы MFС можно добавлять только к проектам MFC
(Я создавал ATL проект)
Как идея, может нужны специальные атрибуты при импорте библиотеки?
Я попробовал несколько комбинаций, видимых изменений не заметил...

kokoc88

Как идея, может нужны специальные атрибуты при импорте библиотеки?
Ты писал no_namespace? Что будет, если написать? Может быть, IApplication определён в нескольких местах?

Dasar

возможная причина:
 конфликтуют имена типов( IApplication распространенное название)
интерфейсы из typelib скорее всего экспортируется в каком-нибудь namespace
соответственно VS при подсказках показывает один тип, а при компиляции подхватывается другой.
решение: аккуратно проверить под какими именами с какими namespace-ами экспортируется typelib

stm7893611

#import "c:\projects\rgb\rgb.siebelcti\CCAconnect2\CCA.tlb" no_namespace
без видимых изменений.
В оригинальном проекте ещё добавлялся файлик comsvcs.h и соответственно comsvcs.lib прописывался где-то в настройках проекта - может он имеет принципиальную важность?
хотя мне он не помог

stm7893611

ну чтож, буду долбиться =)

kokoc88

ну чтож, буду долбиться =)
Поищи, где вообще определён IApplication, текстовым поиском по всему проекту.

stm7893611

А как по всему проекту поискать?
go to definition на IApplicationPtr например выкидывает в CCA.tlh и хз сколько ещё файлов реально подключены к проекту но не видны в solution explorer...
Ладно, разберусь, направление понятно, спасибо большое.

kokoc88

А как по всему проекту поискать?
Far Manager'ом

Reves2

подключены к проекту но не видны в solution explorer
#import "..." создает 2 файла
Это файл .tlh, содержащий описание классов, и файл .tli, который содержит реализацию членов классов

Reves2

(не совсем понял, как этот тип получается из IApplication, как-то так:
_COM_SMARTPTR_TYPEDEF(IApplication, __uuidof(IApplication;)
Это объявление эквивалентно следующему:
typedef _com_ptr_t<IApplication,&__uuidof(IApplication)> IApplicationPtr;
когда набираешь app_CCA->
даже выскакивает подсказка со всеми нужными функциями, которые я и хочу использовать, однако если попытаться вызвать любую из этих функций, например
app_CCA->GetLine;
то вылезает ошибка
error C2039: 'GetLine' : is not a member of 'IApplication'
а GetLine точно член IApplication?
ведь у _com_ptr_t есть метод
IApplication* operator-> const throw(_com_error);
Оставить комментарий
Имя или ник:
Комментарий: