Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Возможности получения информации о типах


Автор: GSasha 25.3.2008, 22:27
Привет всем!
Изучаю С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 

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

Автор: GSasha 25.3.2008, 22:43
Как же тогда поступать с иф-м IUnknown based?
Есть ли возможность достать инфу в таком случае?

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

© Dale Rogerson "Inside COM"

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

Автор: GSasha 25.3.2008, 23:28
Цитата

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



Дело в том, что я пробую генерить vtbl в runtime (для IDispatch based уже работает ), чтобы сгенерить vtbl для не IDispatch based необходимо же откуда - то програмно выгребать информацию о методах, количестве параметров и т.д.. QI, AddRef, Release - no problem, а остальное пока не достал. 
PS
я  клиенту предоставляю свою __CoCreateInstance и возвращаю клиенту свой ppVtbl на pVtbl на сгенерированную мною Vtbl

Автор: GSasha 27.3.2008, 21:45
Цитата

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


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

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

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

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

Автор: GSasha 28.3.2008, 13:43
Цитата

только что обратил внимание на подзаголовок
а чем 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 

Автор: GSasha 29.3.2008, 22:55
.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)