Как получить refid интерфейса по его имени?
От: dx_grey  
Дата: 19.02.03 09:43
Оценка:
Есть задача — вызвать метод Интерфейса. Проблема в том что нет CLSID обьекта и refid интерфейса, есть только ProgId обьекта, символьное имя интерфейса и символьное имя метода этого интерфейса.

К примеру:

ProgId: REMOTEPWCTRL.RemotePwCtrl.1
Интерфейс : IRemotePwControl
Функция: Connect

Интерфейс IRemotePwControl наследуется от IDispatch, есть TLB библиотека

Как получить указатель на интерфейс IRemotePwControl не имея его refid и вызвать функцию Connect?


HRESULT hr;
ITypeLib *pTypeLib;
ITypeInfo *pTypeInfo;
LONG lTypeInfoCount;
OLSESTR strClassName = L"REMOTEPWCTRL.RemotePwCtrl.1";
hr = CLSIDFromProgID(strClassName, &CLSID);

// tlbclsid я беру из реестра, вырезал для краткости
hr = LoadRegTypeLib(tlbclsid, 1, 0, 0, &pTypeLib);

//Далее я могу перечислить все интерфейсы данного обьекта
lTypeInfoCount = pTypeLib->GetTypeInfoCount();
for(int lIter=0; lIter<lTypeInfoCount;lIter++)
{
  pTypeLib->GetDocumentation(lIter, &bstrName, &bstrDocString, NULL, &bstrHelp);
  if(bstrName) ::SysFreeString(bstrName);
}

//Дальше я застрял на получении refid интерфейса по имени.



Извините за неточности.
Re: Как получить refid интерфейса по его имени?
От: Ivan Россия www.rsdn.ru
Дата: 19.02.03 09:52
Оценка:
Здравствуйте, dx_grey, Вы писали:

DG>Интерфейс IRemotePwControl наследуется от IDispatch, есть TLB библиотека

Можно вызывать через IDispatch::Invoke()

А iid интерфейса можно заполучить, импортируя библиотеку типов в свой проект с помощью #import или тебе надо именно динамически tlb загружать ?
Re: Как получить refid интерфейса по его имени?
От: Toughpheeckouse Россия  
Дата: 19.02.03 10:13
Оценка:
Здравствуйте, dx_grey, Вы писали:

DG>

....
DG>//Далее я могу перечислить все интерфейсы данного обьекта
DG>lTypeInfoCount = pTypeLib->GetTypeInfoCount();
DG>for(int lIter=0; lIter<lTypeInfoCount;lIter++)
DG>{
/*сначала нада получить ITypeInfo для этого интерфейса (pTypeLib->GetTypeInfo),
затем у этого ITypeInfo получить TYPEATTR* ( GetTypeAttr, не забуть его вернуть ReleaseTypeAttr )
у полученного TYPEATTR* есть поле guid. все...*/
DG>  pTypeLib->GetDocumentation(lIter, &bstrName, &bstrDocString, NULL, &bstrHelp);
DG>  if(bstrName) ::SysFreeString(bstrName);
DG>}

DG>//Дальше я застрял на получении refid интерфейса по имени.

DG>
Думайте сами, решайте сами...
Re[2]: Как получить refid интерфейса по его имени?
От: dx_grey  
Дата: 19.02.03 10:17
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, dx_grey, Вы писали:


DG>>Интерфейс IRemotePwControl наследуется от IDispatch, есть TLB библиотека

I>Можно вызывать через IDispatch::Invoke()

I>А iid интерфейса можно заполучить, импортируя библиотеку типов в свой проект с помощью #import или тебе надо именно динамически tlb загружать ?


Да мне необходимо загружать tlb динамически.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.