[COM] Получить список интерфейсов и их методов

Vladislav177Rus

Можно ли получить список интерфейсов (желательно не только IID, но и название) некоторого объекта и методов этих интерфейсов:
1) с помощью IDispatch
2) вообще
и если да, то как?

stat7984215

1) Можно попытаться через IDispatch::GetTypeInfo
2) Если доступна библиотека типов, то можно попробовать через ITypeLib/ITypeInfo
еще можно перебором через QueryInterface

yolki

OLE Viewer из тулзов к вижуалстудии
или Import Type Library в Delphi.
Также, если известно, какая dll/odl/ocx/tlb отвечает за интерфейс, то в С++ программе можно написать

#import "blabla.ocx" no_namespace
// поботать #import

и она у тебя при первой компиляции сгенерит обёрточный класс с именами, которые дал разработчик.
Вот я с одной шнягой разбираюсь - так там идентификаторы на японском
Примерчик класса:

struct __declspec(uuid("bea923a1-463b-11d8-b597-0000e2157c3b"
_ShashuInput : IDispatch
{
//
// Property data
//

__declspec(property(get=GetAutoInpType,put=PutAutoInpType
VARIANT_BOOL AutoInpType;
__declspec(property(get=GetitYoso,put=PutitYoso
enum eInputType itYoso;
__declspec(property(get=GetitTrim,put=PutitTrim
enum eInputType itTrim;
__declspec(property(get=GetitColor,put=PutitColor
enum eInputType itColor;
__declspec(property(get=GetitDest,put=PutitDest
enum eInputType itDest;
__declspec(property(get=GetitOPCode,put=PutitOPCode
enum eInputType itOPCode;
__declspec(property(get=GetitNengetsu,put=PutitNengetsu
enum eInputType itNengetsu;
__declspec(property(get=GetifOPCode
short ifOPCode;
__declspec(property(get=GetifNenshiki
short ifNenshiki;
__declspec(property(get=GetitShashuJoho,put=PutitShashuJoho
enum eInputType itShashuJoho;
__declspec(property(get=GetpTaiou,put=PutpTaiou
_variant_t pTaiou;
__declspec(property(get=GetpYearTY,put=PutpYearTY
_variant_t pYearTY;
__declspec(property(get=GetpYearST,put=PutpYearST
_variant_t pYearST;
__declspec(property(get=GetpYearIN,put=PutpYearIN
_variant_t pYearIN;
__declspec(property(get=GetpPos,put=PutpPos
_variant_t pPos;
__declspec(property(get=GetpDestination,put=PutpDestination
_bstr_t pDestination;
__declspec(property(get=GetpYosoMax,put=PutpYosoMax
short pYosoMax;
__declspec(property(put=PutpTrimName
_variant_t pTrimName;
__declspec(property(get=GetpTrim,put=PutpTrim
_variant_t pTrim;
__declspec(property(put=PutpColorName
_variant_t pColorName;
__declspec(property(get=GetpColor,put=PutpColor
_variant_t pColor;
__declspec(property(get=GetpOPCode,put=PutpOPCode
_variant_t pOPCode;
__declspec(property(get=GetpNenshiki,put=PutpNenshiki
_bstr_t pNenshiki;
__declspec(property(get=GetpModel,put=PutpModel
_variant_t pModel;
__declspec(property(get=GetpChassie,put=PutpChassie
_variant_t pChassie;
__declspec(property(get=GetpShashu,put=PutpShashu
_variant_t pShashu;
__declspec(property(get=GetpVolflg,put=PutpVolflg
VARIANT_BOOL pVolflg;
__declspec(property(get=GetpFilePath,put=PutpFilePath
_variant_t pFilePath;
__declspec(property(get=GetpFastDir,put=PutpFastDir
_variant_t pFastDir;
__declspec(property(get=GetDecisionShashu
VARIANT_BOOL DecisionShashu;
__declspec(property(get=GetifShashuIFType,put=PutifShashuIFType
enum ShashuIFType ifShashuIFType;
__declspec(property(get=GetRaiseChangeEvents,put=PutRaiseChangeEvents
VARIANT_BOOL RaiseChangeEvents;
__declspec(property(get=GetErrMsgDialog,put=PutErrMsgDialog
VARIANT_BOOL ErrMsgDialog;
__declspec(property(get=GetActionMode,put=PutActionMode
enum eActionMode ActionMode;

Corrector

Import Type Library в Delphi.
кстати мне всегда было интересно, как с помощью Import Type Library получаются списки OLE-объектов, их методов и параметров этих методов.
Где именно они хранятся, в Dll ? Если да, то с помощью какого интерфейса их вытащить? В IDispatch не нашел подходящих методов.

yolki

эээ GetTypeInfo?

sbs-66

В COM-сервере должен зарегистрироваться. В DLL это просто функция с каким-то именем стандартным. Она должна прописать в реестре запись о всех COM-итерфейсах, которые предоставляет. Оттуда её и берут.

stat7984215

Где именно они хранятся, в Dll ?
В библиотеке типов: она либо в виде отдельного файла *.tlb либо запихана в DLL в виде ресурса.
Если да, то с помощью какого интерфейса их вытащить
ITypeInfo/ITypeLib.
Оставить комментарий
Имя или ник:
Комментарий: