Помогите разобраться с клиентом для COM обьекта
От: Danj  
Дата: 19.08.04 13:37
Оценка:
Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать?
За раннее благодарен!
Re: Помогите разобраться с клиентом для COM обьекта
От: dingo Россия http://wm.quest.com
Дата: 19.08.04 14:15
Оценка:
Здравствуйте, Danj, Вы писали:

D>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать?

D>За раннее благодарен!

HRESULT LoadTypeLib(const OLECHAR FAR* szFile, ITypeLib FAR* FAR* pptlib);
или
HRESULT LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind, ITypeLib** pptlib);

разберись с интерфейсом ITypeLib;

Удачи!
Re[2]: Помогите разобраться с клиентом для COM обьекта
От: Danj  
Дата: 19.08.04 14:20
Оценка:
Здравствуйте, 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 обьекта
От: unrealalex Россия  
Дата: 19.08.04 14:33
Оценка:
Здравствуйте, Danj, Вы писали:

D>Задача такая: Есть COM обьект с поддержкой автоматизации (IDispatch) и который реализует один дуальный интерфейс. Создаю клиент (C++) и хочу работать с интерфейсом через VTBL но нехочу давать файл с определениями интерфейсов. Мне кажеться что можно получить эту информацию из библиотеки типов, но как это сделать?

D>За раннее благодарен!



 #import
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_The_.23.import_Directive.asp
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re[3]: Помогите разобраться с клиентом для COM обьекта
От: dingo Россия http://wm.quest.com
Дата: 19.08.04 16:07
Оценка:
Здравствуйте, 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 обьекта
От: Danj  
Дата: 20.08.04 07:09
Оценка:
Здравствуйте, dingo, Вы писали:

D>Не на чем. Забыл сказать. То, что написано выше, надо, если хочешь пользовать инфу в ран-тайме. В других случаях вполне подойдет #import.

Чтот я совсем запутался. Кто то написал COM (не важно exe или dll) с поддержкой дуального интерфейса. И я хочу юзать его через VTB. Но у меня нет заголовочного файла с описаниям интерфейса и определениями GUID и CLSID. Есть только ProgId и все! Что делать?
Re[5]: Помогите разобраться с клиентом для COM обьекта
От: rus blood Россия  
Дата: 20.08.04 07:55
Оценка:
Здравствуйте, 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 обьекта
От: TTL Беларусь  
Дата: 20.08.04 08:05
Оценка:
Здравствуйте, 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 обьекта
От: TTL Беларусь  
Дата: 20.08.04 08:08
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>1. Вставь директиву #import (параметры смотри в MSDN) в код. Компилятор сгенерирует tlh/tli файлы с определениями интерфейсов и смарт-пойнтеров для работы с объектами.


RB>2. Запусти OleViewer, загрузи dll-файл, скопируй IDL на диск, запусти MIDL, который сгенерирует тебе файлы определения интерфейсов и tlb.

Как этот MIDL запустить?
Re[7]: Помогите разобраться с клиентом для COM обьекта
От: George Seryakov Россия  
Дата: 20.08.04 17:29
Оценка: +1 :))
Здравствуйте, 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 обьекта
От: Danj  
Дата: 25.08.04 11:43
Оценка:
Сиба всем приняышим участие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.