Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать?
За раннее благодарен!
Re: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, Danj, Вы писали:
D>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать? D>За раннее благодарен!
Здравствуйте, dingo, Вы писали:
D>Здравствуйте, Danj, Вы писали:
D>>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать? D>>За раннее благодарен!
D>HRESULT LoadTypeLib(const OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib); D>или D>HRESULT LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind, ITypeLib** pptlib);
D>разберись с интерфейсом ITypeLib;
D>Удачи!
Спасибо буду рыть дальше!
Re: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, Danj, Вы писали:
D>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать? D>За раннее благодарен!
Здравствуйте, Danj, Вы писали:
D>Здравствуйте, dingo, Вы писали:
D>>Здравствуйте, Danj, Вы писали:
D>>>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать? D>>>За раннее благодарен!
D>>HRESULT LoadTypeLib(const OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib); D>>или D>>HRESULT LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind, ITypeLib** pptlib);
D>>разберись с интерфейсом ITypeLib;
D>>Удачи!
D>Спасибо буду рыть дальше!
Не на чем. Забыл сказать. То, что написано выше, надо, если хочешь пользовать инфу в ран-тайме. В других случаях вполне подойдет #import.
Re[4]: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, dingo, Вы писали:
D>Не на чем. Забыл сказать. То, что написано выше, надо, если хочешь пользовать инфу в ран-тайме. В других случаях вполне подойдет #import.
Чтот я совсем запутался. Кто то написал COM (не важно exe или dll) с поддержкой дуального интерфейса. И я хочу юзать его через VTB. Но у меня нет заголовочного файла с описаниям интерфейса и определениями GUID и CLSID. Есть только ProgId и все! Что делать?
Re[5]: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, Danj, Вы писали:
D>Здравствуйте, dingo, Вы писали:
D>>Не на чем. Забыл сказать. То, что написано выше, надо, если хочешь пользовать инфу в ран-тайме. В других случаях вполне подойдет #import. D>Чтот я совсем запутался. Кто то написал COM (не важно exe или dll) с поддержкой дуального интерфейса. И я хочу юзать его через VTB. Но у меня нет заголовочного файла с описаниям интерфейса и определениями GUID и CLSID. Есть только ProgId и все! Что делать?
1. Вставь директиву #import (параметры смотри в MSDN) в код. Компилятор сгенерирует tlh/tli файлы с определениями интерфейсов и смарт-пойнтеров для работы с объектами.
2. Запусти OleViewer, загрузи dll-файл, скопируй IDL на диск, запусти MIDL, который сгенерирует тебе файлы определения интерфейсов и tlb.
Имею скафандр — готов путешествовать!
Re[5]: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, Danj, Вы писали:
D>Здравствуйте, dingo, Вы писали:
D>>Не на чем. Забыл сказать. То, что написано выше, надо, если хочешь пользовать инфу в ран-тайме. В других случаях вполне подойдет #import. D>Чтот я совсем запутался. Кто то написал COM (не важно exe или dll) с поддержкой дуального интерфейса. И я хочу юзать его через VTB. Но у меня нет заголовочного файла с описаниям интерфейса и определениями GUID и CLSID. Есть только ProgId и все! Что делать?
Мне тут самому недавно Vi2 объяснял (смотри ветку "Инициализация DISPPARAMS"), за что ему большое спасибо, а я попробую тебе объяснить.
Сначала с помощью директивы Import генерируешь два файла tlb и tlh, в них будут находится объявления и определения доступных тебе
функций и свойств, а также обертки SMART-указателей, вот через них наверное тебе и надо будет вызывать.
В моем случае было так:
AxCrypto — моя библиотека.
#import"AxCrypto16T.ocx" no_namespace
Получил два файла с расширениями tlb и tlh. В них было что-то вида
COM_SMARTPTR_TYPEDEF(ICripto16TX, __uuidof(ICripto16TX));
struct __declspec(uuid("a13bf834-32e1-4d0e-9897-1f4834e3e3af")) ICripto16TX : IDispatch
{
//
// Property data
....
};
Вызывать функции ICripto16TX интерфейса
ICripto16TX * pObj;
hr = CoCreateInstance( __uuidof(Cripto16TX), NULL, CLSCTX_SERVER, __uuidof(ICripto16TX), (void**) &pObj );
...
CComVaraint State, KeyPressed, InputLen, EndKey, PinBlock;
pObj->SecPinInputRequest( &State, &KeyPressed, &InputLen, &EndKey, &PinBlock ); //вызов моей функции
...
pObj->Release();
Через смарт-пойнтер
ICripto16TXPtr pObj( __uuidof(Cripto16TX), NULL, CLSCTX_SERVER );
...
CComVaraint State, KeyPressed, InputLen, EndKey, PinBlock;
pObj->SecPinInputRequest( &State, &KeyPressed, &InputLen, &EndKey, &PinBlock );
...
Re[6]: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, rus blood, Вы писали:
RB>1. Вставь директиву #import (параметры смотри в MSDN) в код. Компилятор сгенерирует tlh/tli файлы с определениями интерфейсов и смарт-пойнтеров для работы с объектами.
RB>2. Запусти OleViewer, загрузи dll-файл, скопируй IDL на диск, запусти MIDL, который сгенерирует тебе файлы определения интерфейсов и tlb.
Как этот MIDL запустить?
Re[7]: Помогите разобраться с клиентом для COM обьекта
Здравствуйте, TTL, Вы писали:
TTL>Здравствуйте, rus blood, Вы писали:
RB>>1. Вставь директиву #import (параметры смотри в MSDN) в код. Компилятор сгенерирует tlh/tli файлы с определениями интерфейсов и смарт-пойнтеров для работы с объектами.
RB>>2. Запусти OleViewer, загрузи dll-файл, скопируй IDL на диск, запусти MIDL, который сгенерирует тебе файлы определения интерфейсов и tlb.
rus blood имеет в виду, что либо 1 либо 2. Причем я не вижу причин для способа 2 кроме как для упражнения.
TTL>Как этот MIDL запустить?
Оставляется в качестве самостоятельного упражнения пытливому читателю. Если не сможешь — и COM тебе не нужен.
GS
Re[8]: Помогите разобраться с клиентом для COM обьекта