Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возможности получения информации о типах, без LoadTypeLib 
V
    Опции темы
GSasha
Дата 25.3.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Привет всем!
Изучаю СOM, и вот прочитал в RSDN интересную статейку о способах перехвата вызовов методов и-фейса, для этого нужно иметь достаточно инфы о нём.

Возможность получения информации о типах, методах и т. д. интерфейса имеется с помощю методов IDispatch 
напр.
Код

  pTarget->GetTypeInfoCount( &nTypeInfoCount ) 
  pTarget->GetTypeInfo( i, LOCALE_SYSTEM_DEFAULT, &spTypeInfo ) 
  spTypeInfo->GetFuncDesc( index, &pDesc ) 
  spTypeInfo->GetDocumentation( pDesc->memid, &bsFuncName, NULL, NULL, NULL ) 
...... 


Но как можно ли получить инфу о методах  с typeLib не IDispatch based интерфейса в runtime!!!
Пока я остановился на мысли о ручном получении пути к компоненту (точнее его TypeLib) с помощю поиска в реестре по CLSID!!!
Есть ли более порядочный способ получения ITypeLib имея какой ниб интерфейс? smile 
Буду благодарен за поддержку! smile 

PM MAIL ICQ   Вверх
Rififi
Дата 25.3.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



typelib создается только для disp- или dual-интерфейса. исключительно для поддержки скриптовыми языками.
если интерфейс не-, то никакой информации о типах нет.
PM MAIL   Вверх
GSasha
Дата 25.3.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Как же тогда поступать с иф-м IUnknown based?
Есть ли возможность достать инфу в таком случае?
PM MAIL ICQ   Вверх
Rififi
Дата 25.3.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



Цитата
Первым вопросом, который я задал при изучении СОМ, был: «Почему я не могу сразу запросить у компонента
все его интерфейсы?». Ответ в духе Дзен гласит: «Что станешь ты делать со списком интерфейсов, поддерживаемых компонентом?»

© Dale Rogerson "Inside COM"

Списки типов - практически то же самое.

Это сообщение отредактировал(а) Rififi - 25.3.2008, 23:00
PM MAIL   Вверх
GSasha
Дата 25.3.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата

Списки типов - практически то же самое.



Дело в том, что я пробую генерить vtbl в runtime (для IDispatch based уже работает ), чтобы сгенерить vtbl для не IDispatch based необходимо же откуда - то програмно выгребать информацию о методах, количестве параметров и т.д.. QI, AddRef, Release - no problem, а остальное пока не достал. 
PS
я  клиенту предоставляю свою __CoCreateInstance и возвращаю клиенту свой ppVtbl на pVtbl на сгенерированную мною Vtbl
PM MAIL ICQ   Вверх
GSasha
Дата 27.3.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата

typelib создается только для disp- или dual-интерфейса. исключительно для поддержки скриптовыми языками.
если интерфейс не-, то никакой информации о типах нет.


Не правда, так как type library создана не для IDispatch, а для RPC поэтому в каждом COMпоненте присутствуют все данные о типах!!! smile

Добавлено через 6 минут и 7 секунд
Любой компонент можно использовать выгребая информацию о типах, стоит только в реестре получить путь к компоненту ( по CLSID\InprocServer32\... ) и получить ITypeLib, а дальше каждый тип 
детализировать и выбрать нужный с легкостю позволяет ITypeInfo smile 

PM MAIL ICQ   Вверх
izekia
Дата 28.3.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 5.12.2007

Репутация: нет
Всего: 3



GSasha,
если посмотреть реализацию IDispatch в ATL, то можно обнаружить класс CComTypeInfoHolder, который используется по умолчанию
собственно можно обратить внимание на реализацию метода GetTI

только что обратил внимание на подзаголовок
а чем LoadTypeLib не устраивает?

Это сообщение отредактировал(а) izekia - 28.3.2008, 09:39
PM MAIL   Вверх
GSasha
Дата 28.3.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата

только что обратил внимание на подзаголовок
а чем LoadTypeLib не устраивает?


Уже усраивает,  smile 
Я искал способ получения ITypeInfo имея в наличии только traget interface( возможно только для IDispatch based ), для не-... LoadTypeLib остается
Цитата

Любой компонент можно использовать выгребая информацию о типах, стоит только в реестре получить путь к компоненту ( по CLSID\InprocServer32\... ) и получить ITypeLib, а дальше каждый тип 
детализировать и выбрать нужный с легкостю позволяет ITypeInfo 

Код


LONG lRet = RegOpenKeyExW( HKEY_CLASSES_ROOT, bsSubKey, 0, KEY_QUERY_VALUE, &hKey );
        if ( lRet == ERROR_SUCCESS )
        {
            lRet = RegQueryValueExW( hKey, NULL, NULL, NULL, ( LPBYTE )szPath, &dwBufLen );
            if ( lRet == ERROR_SUCCESS )
            {
                if ( FAILED( hr = LoadTypeLib( CComBSTR( szPath ), pTypeLib ) ) )       
                    pTypeLib = NULL;
            }
            else
                hr = HRESULT_FROM_WIN32( lRet );

            RegCloseKey( hKey );
        }


вот и все! smile 
PM MAIL ICQ   Вверх
GSasha
Дата 29.3.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 23.3.2008
Где: Ukraine

Репутация: нет
Всего: нет



.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0922 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.