INTERFACEINFO как добраться до нужного метода
От: bkat  
Дата: 03.04.02 08:58
Оценка:
Как по имеющейся иноформации из структуры типа INTERFACEINFO
получить данные о методе?

В MSDN INTERFACEINFO определяется как

typedef struct tagINTERFACEINFO
{
LPUNKNOWN pUnk;
IID iid;
WORD wMethod;
} INTERFACEINFO, * LPINTERFACEINFO;

Меня интересует 3-е поле wMethod.

Проблема возникла в связи с реализацией собственного IMessageFilter::HandleIncomingCall
и мне нужно фильтровать вызовы только определенного метода.
Re: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 11:56
Оценка:
Здравствуйте bkat, Вы писали:

B>Как по имеющейся иноформации из структуры типа INTERFACEINFO

B>получить данные о методе?

B>В MSDN INTERFACEINFO определяется как


B>typedef struct tagINTERFACEINFO

B>{
B> LPUNKNOWN pUnk;
B> IID iid;
B> WORD wMethod;
B>} INTERFACEINFO, * LPINTERFACEINFO;

B>Меня интересует 3-е поле wMethod.


B>Проблема возникла в связи с реализацией собственного IMessageFilter::HandleIncomingCall

B>и мне нужно фильтровать вызовы только определенного метода.

Может это параметр id() из описание функций в интерфейсе?
[ id(1), propget,helpstring("...")] HRESULT Content([out, retval] BSTR *pVal);
Отлови это значение и посмотри-сравни.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: INTERFACEINFO как добраться до нужного метода
От: Sergey Россия  
Дата: 03.04.02 12:50
Оценка: 3 (1)
Здравствуйте Vi2, Вы писали:

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


B>>Как по имеющейся иноформации из структуры типа INTERFACEINFO

B>>получить данные о методе?

B>>В MSDN INTERFACEINFO определяется как


B>>typedef struct tagINTERFACEINFO

B>>{
B>> LPUNKNOWN pUnk;
B>> IID iid;
B>> WORD wMethod;
B>>} INTERFACEINFO, * LPINTERFACEINFO;

B>>Меня интересует 3-е поле wMethod.


B>>Проблема возникла в связи с реализацией собственного IMessageFilter::HandleIncomingCall

B>>и мне нужно фильтровать вызовы только определенного метода.

Vi2>Может это параметр id() из описание функций в интерфейсе?

Vi2>[ id(1), propget,helpstring("...")] HRESULT Content([out, retval] BSTR *pVal);
Vi2>Отлови это значение и посмотри-сравни.

Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 12:53
Оценка:
Здравствуйте Sergey, Вы писали:

S>Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl.

А id() применим к любому интерфейсу, не только к IDispatch.
Вот пример из MSDN:
Example
interface IKnown : IUnknown
{
    properties:
        [id(90), propget, 
         helpstring("A meaningful comment."] long Func1(void);

    /* Other interface statements */
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: INTERFACEINFO как добраться до нужного метода
От: bkat  
Дата: 03.04.02 13:10
Оценка:
Здравствуйте Sergey, Вы писали:

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


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


B>>>Как по имеющейся иноформации из структуры типа INTERFACEINFO

B>>>получить данные о методе?

B>>>В MSDN INTERFACEINFO определяется как


B>>>typedef struct tagINTERFACEINFO

B>>>{
B>>> LPUNKNOWN pUnk;
B>>> IID iid;
B>>> WORD wMethod;
B>>>} INTERFACEINFO, * LPINTERFACEINFO;

B>>>Меня интересует 3-е поле wMethod.


B>>>Проблема возникла в связи с реализацией собственного IMessageFilter::HandleIncomingCall

B>>>и мне нужно фильтровать вызовы только определенного метода.

Vi2>>Может это параметр id() из описание функций в интерфейсе?

Vi2>>[ id(1), propget,helpstring("...")] HRESULT Content([out, retval] BSTR *pVal);
Vi2>>Отлови это значение и посмотри-сравни.

S>Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl.


Скорей всего Sergey прав.
Можно ли легально и безопасно добраться до нужного метода?
Меня интересует только факт, вызывается ли определенный метод,
или вызывается что-то другое.
Re[4]: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 13:15
Оценка:
Здравствуйте bkat, Вы писали:

B>Скорей всего Sergey прав.

B>Можно ли легально и безопасно добраться до нужного метода?
B>Меня интересует только факт, вызывается ли определенный метод,
B>или вызывается что-то другое.

Remarks
Use the [id] attribute when you want to assign a standard DISPID (like DISPID_VALUE, DISPID_NEWENUM etc.) to a method or property, or when you implement your own IDispatch::Invoke instead of delegating to DispInvoke/ITypeInfo::Invoke.

If you do not use the [id] attribute on an interface, the MIDL compiler will assign a DISPID for you. However, when you specify a dispinterface by using properties and methods, you must specify a DISPID for every property and method.

The id-num is a 32-bit positive integral value. Negative IDs are reserved for use by Automation.

Меня же смущает его 32-bit разрядность по сравнению с WORD wMethod.
Но это же и было предположение.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: INTERFACEINFO как добраться до нужного метода
От: Sergey Россия  
Дата: 03.04.02 13:15
Оценка:
Здравствуйте Vi2, Вы писали:

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


S>>Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl.

Vi2>А id() применим к любому интерфейсу, не только к IDispatch.
Vi2>Вот пример из MSDN:
Vi2>
Vi2>Example
Vi2>interface IKnown : IUnknown
Vi2>{
Vi2>    properties:
Vi2>        [id(90), propget, 
Vi2>         helpstring("A meaningful comment."] long Func1(void);

Vi2>    /* Other interface statements */
Vi2>}
Vi2>


А текст над примером ты прочитал? Там, по-моему, вполне прозрачно на IDispatch намекается. Опять же, поскольку пример не скомпилируется, не следует относиться к нему слишком серьезно. Что, по твоему, может означать propget для обычного (не dual и не dispinterface) интерфейса?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: Добавление
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 13:18
Оценка:
А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Добавление
От: Sergey Россия  
Дата: 03.04.02 13:26
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!


А TypeLibrary бывает только для интерфейсов, унаследованных от IDispatch.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 13:27
Оценка:
Здравствуйте Sergey, Вы писали:

S>А текст над примером ты прочитал? Там, по-моему, вполне прозрачно на IDispatch намекается. Опять же, поскольку пример не скомпилируется, не следует относиться к нему слишком серьезно. Что, по твоему, может означать propget для обычного (не dual и не dispinterface) интерфейса?

В ITypeInfo есть функция GetFuncDesc(UINT index,FUNCDESC** ppFuncDesc), которая возвращает для порядкового номера информацию о функции. Очевидно, что она работает на любом интерфейсе библиотеки. И содержит полезную информацию.
typedef struct  tagFUNCDESC
    {
    MEMBERID memid;
    /* [size_is] */ SCODE __RPC_FAR *lprgscode;
    /* [size_is] */ ELEMDESC __RPC_FAR *lprgelemdescParam;
    FUNCKIND funckind;
    INVOKEKIND invkind;
    CALLCONV callconv;
    SHORT cParams;
    SHORT cParamsOpt;
    SHORT oVft;
    SHORT cScodes;
    ELEMDESC elemdescFunc;
    WORD wFuncFlags;
    }    FUNCDESC;

Но ЭТОТ ли параметр передается, это вопрос.
Скорее всего, нет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Добавление
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 13:29
Оценка:
Здравствуйте Sergey, Вы писали:

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


Vi2>>А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!


S>А TypeLibrary бывает только для интерфейсов, унаследованных от IDispatch.

Посмотри здесь
Автор: Lexey
Дата: 03.04.02
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: INTERFACEINFO как добраться до нужного метода
От: Sergey Россия  
Дата: 03.04.02 13:39
Оценка: 3 (1)
Здравствуйте bkat, Вы писали:

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


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


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


B>>>>Как по имеющейся иноформации из структуры типа INTERFACEINFO

B>>>>получить данные о методе?

B>>>>В MSDN INTERFACEINFO определяется как


B>>>>typedef struct tagINTERFACEINFO

B>>>>{
B>>>> LPUNKNOWN pUnk;
B>>>> IID iid;
B>>>> WORD wMethod;
B>>>>} INTERFACEINFO, * LPINTERFACEINFO;

B>>>>Меня интересует 3-е поле wMethod.


B>>>>Проблема возникла в связи с реализацией собственного IMessageFilter::HandleIncomingCall

B>>>>и мне нужно фильтровать вызовы только определенного метода.

Vi2>>>Может это параметр id() из описание функций в интерфейсе?

Vi2>>>[ id(1), propget,helpstring("...")] HRESULT Content([out, retval] BSTR *pVal);
Vi2>>>Отлови это значение и посмотри-сравни.

S>>Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl.


B>Скорей всего Sergey прав.

B>Можно ли легально и безопасно добраться до нужного метода?
Вполне легально. Безопасно, пока ты не поменял интерфейс (что спецификацией COM делать запрещено).
B>Меня интересует только факт, вызывается ли определенный метод,
B>или вызывается что-то другое.
Просто сравнивай этот wMethod со значеним для нужного метода. Узнать какое оно, можно либо просто посмотрев в отладчике путем, либо заглянув в генеренный midl'ом хедер. В сишной его части (не плюсовой, там как раз хрен разберешься что куда попадет) есть симпатичная структурка вида "typedef struct IxxxxxxxVtbl". Если я прав, то wMethod — это просто порядковый номер твоего метода в этой структуре.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Добавление
От: Sergey Россия  
Дата: 03.04.02 13:57
Оценка:
Здравствуйте Vi2, Вы писали:

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


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


Vi2>>>А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!


S>>А TypeLibrary бывает только для интерфейсов, унаследованных от IDispatch.

Vi2>Посмотри здесь
Автор: Lexey
Дата: 03.04.02


Хорошо, смотрим:

-lexa->бинарный стандарт обеспечивается и без библиотеки типов, а она является неким необязательным дополнением, которое >может быть использовано другими компонентами/приложениями для получения информации о ком объекте?

Lexey>Да.



Остается повторить, что информация из TypeLibrary имеет смысл только для интерфейсов, унаследованных от IDispatch (или от ITypeInfo ), а MIDL compiler можно заставить не генерить tlb (опция /notlb). Более того, и idl или odl файл можно вообще не создавать и MIDL compiler'ом не пользоваться, а маршаллинг данных сделать руками (или не делать, если он не нужен).
Структура INTERFACEINFO, про которую был вопрос, никаким боком не относится к dispatch, соответственно TypeLibrary тут не причем.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[9]: Конец добавлениям
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 14:05
Оценка:
Здравствуйте Sergey, Вы писали:

S>Остается повторить, что информация из TypeLibrary имеет смысл только для интерфейсов, унаследованных от IDispatch (или от ITypeInfo ), а MIDL compiler можно заставить не генерить tlb (опция /notlb). Более того, и idl или odl файл можно вообще не создавать и MIDL compiler'ом не пользоваться, а маршаллинг данных сделать руками (или не делать, если он не нужен).

S>Структура INTERFACEINFO, про которую был вопрос, никаким боком не относится к dispatch, соответственно TypeLibrary тут не причем.
Убедительно.
НО, если не создавать ни IDL, ни TLB, то резонный вопрос: кто же сможет пользоваться твоим объектом?
По этому вопросу, я думаю, не стоит затевать дисскуссию, т.к. он все равно не решает проблему топика.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 14:10
Оценка:
Здравствуйте Sergey, Вы писали:

S> Просто сравнивай этот wMethod со значеним для нужного метода. Узнать какое оно, можно либо просто посмотрев в отладчике путем, либо заглянув в генеренный midl'ом хедер. В сишной его части (не плюсовой, там как раз хрен разберешься что куда попадет) есть симпатичная структурка вида "typedef struct IxxxxxxxVtbl". Если я прав, то wMethod — это просто порядковый номер твоего метода в этой структуре.

Я присоединяюсь к Sergey.
Только если интерфейс порождается из другого, а тот из третьего, то какой номер использовать?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: INTERFACEINFO как добраться до нужного метода
От: bkat  
Дата: 03.04.02 14:19
Оценка:
Здравствуйте Vi2, Вы писали:

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


S>> Просто сравнивай этот wMethod со значеним для нужного метода. Узнать какое оно, можно либо просто посмотрев в отладчике путем, либо заглянув в генеренный midl'ом хедер. В сишной его части (не плюсовой, там как раз хрен разберешься что куда попадет) есть симпатичная структурка вида "typedef struct IxxxxxxxVtbl". Если я прав, то wMethod — это просто порядковый номер твоего метода в этой структуре.

Vi2>Я присоединяюсь к Sergey.
Vi2>Только если интерфейс порождается из другого, а тот из третьего, то какой номер использовать?

Для этого в структуре INTERFACEINFO и есть
второе поле iid, которое позволяет добраться до нужного интерфейса.
Re[7]: INTERFACEINFO как добраться до нужного метода
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.04.02 14:21
Оценка:
Здравствуйте bkat, Вы писали:

B>Для этого в структуре INTERFACEINFO и есть

B>второе поле iid, которое позволяет добраться до нужного интерфейса.
Так получается или нет? Твой же проект. У меня и похожего-то нет, чтобы проверить.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: INTERFACEINFO как добраться до нужного метода
От: bkat  
Дата: 03.04.02 14:26
Оценка:
Здравствуйте Vi2, Вы писали:

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


B>>Для этого в структуре INTERFACEINFO и есть

B>>второе поле iid, которое позволяет добраться до нужного интерфейса.
Vi2>Так получается или нет? Твой же проект. У меня и похожего-то нет, чтобы проверить.

В принципе получается, но подводные камни ожидаются ;)
Всем большое спасибо за идеи!
Re[10]: Конец добавлениям
От: Sergey Россия  
Дата: 04.04.02 08:40
Оценка:
Здравствуйте Vi2, Вы писали:

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


S>>Остается повторить, что информация из TypeLibrary имеет смысл только для интерфейсов, унаследованных от IDispatch (или от ITypeInfo ), а MIDL compiler можно заставить не генерить tlb (опция /notlb). Более того, и idl или odl файл можно вообще не создавать и MIDL compiler'ом не пользоваться, а маршаллинг данных сделать руками (или не делать, если он не нужен).

S>>Структура INTERFACEINFO, про которую был вопрос, никаким боком не относится к dispatch, соответственно TypeLibrary тут не причем.
Vi2>Убедительно.
Vi2>НО, если не создавать ни IDL, ни TLB, то резонный вопрос: кто же сможет пользоваться твоим объектом?
Vi2>По этому вопросу, я думаю, не стоит затевать дисскуссию, т.к. он все равно не решает проблему топика.

А кто может пользоваться интерфейсом IUnknown? Тот, кто про него знает (у кого сишный/плюсовый/на другом языке хедер есть).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.