Здравствуйте 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[4]: INTERFACEINFO как добраться до нужного метода
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте 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);
Отлови это значение и посмотри-сравни.
Здравствуйте 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 */
}
Здравствуйте 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 как добраться до нужного метода
Здравствуйте 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.
Но это же и было предположение.
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Sergey, Вы писали:
S>>Это вряд ли, потому что IDispatch тут совершенно не причем. Скорее всего, это просто порядковый номер метода в интерфейсе, применительно к C++ — позиция метода в vtbl. Vi2>А id() применим к любому интерфейсу, не только к IDispatch. Vi2>Вот пример из MSDN: Vi2>
А текст над примером ты прочитал? Там, по-моему, вполне прозрачно на IDispatch намекается. Опять же, поскольку пример не скомпилируется, не следует относиться к нему слишком серьезно. Что, по твоему, может означать propget для обычного (не dual и не dispinterface) интерфейса?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте 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;
Но ЭТОТ ли параметр передается, это вопрос.
Скорее всего, нет.
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Vi2, Вы писали:
Vi2>>А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!
S>А TypeLibrary бывает только для интерфейсов, унаследованных от IDispatch.
Посмотри здесь
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Sergey, Вы писали:
S>>Здравствуйте Vi2, Вы писали:
Vi2>>>А также мой опыт работы TypeLibrary говорит, что любому методу любого интерфейса назначен id()!
S>>А TypeLibrary бывает только для интерфейсов, унаследованных от IDispatch. Vi2>Посмотри здесь
-lexa->бинарный стандарт обеспечивается и без библиотеки типов, а она является неким необязательным дополнением, которое >может быть использовано другими компонентами/приложениями для получения информации о ком объекте?
Lexey>Да.
Остается повторить, что информация из TypeLibrary имеет смысл только для интерфейсов, унаследованных от IDispatch (или от ITypeInfo ), а MIDL compiler можно заставить не генерить tlb (опция /notlb). Более того, и idl или odl файл можно вообще не создавать и MIDL compiler'ом не пользоваться, а маршаллинг данных сделать руками (или не делать, если он не нужен).
Структура INTERFACEINFO, про которую был вопрос, никаким боком не относится к dispatch, соответственно TypeLibrary тут не причем.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Остается повторить, что информация из TypeLibrary имеет смысл только для интерфейсов, унаследованных от IDispatch (или от ITypeInfo ), а MIDL compiler можно заставить не генерить tlb (опция /notlb). Более того, и idl или odl файл можно вообще не создавать и MIDL compiler'ом не пользоваться, а маршаллинг данных сделать руками (или не делать, если он не нужен). S>Структура INTERFACEINFO, про которую был вопрос, никаким боком не относится к dispatch, соответственно TypeLibrary тут не причем.
Убедительно.
НО, если не создавать ни IDL, ни TLB, то резонный вопрос: кто же сможет пользоваться твоим объектом?
По этому вопросу, я думаю, не стоит затевать дисскуссию, т.к. он все равно не решает проблему топика.
Здравствуйте Sergey, Вы писали:
S> Просто сравнивай этот wMethod со значеним для нужного метода. Узнать какое оно, можно либо просто посмотрев в отладчике путем, либо заглянув в генеренный midl'ом хедер. В сишной его части (не плюсовой, там как раз хрен разберешься что куда попадет) есть симпатичная структурка вида "typedef struct IxxxxxxxVtbl". Если я прав, то wMethod — это просто порядковый номер твоего метода в этой структуре.
Я присоединяюсь к Sergey.
Только если интерфейс порождается из другого, а тот из третьего, то какой номер использовать?
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте Sergey, Вы писали:
S>> Просто сравнивай этот wMethod со значеним для нужного метода. Узнать какое оно, можно либо просто посмотрев в отладчике путем, либо заглянув в генеренный midl'ом хедер. В сишной его части (не плюсовой, там как раз хрен разберешься что куда попадет) есть симпатичная структурка вида "typedef struct IxxxxxxxVtbl". Если я прав, то wMethod — это просто порядковый номер твоего метода в этой структуре. Vi2>Я присоединяюсь к Sergey. Vi2>Только если интерфейс порождается из другого, а тот из третьего, то какой номер использовать?
Для этого в структуре INTERFACEINFO и есть
второе поле iid, которое позволяет добраться до нужного интерфейса.
Re[7]: INTERFACEINFO как добраться до нужного метода
Здравствуйте bkat, Вы писали:
B>Для этого в структуре INTERFACEINFO и есть B>второе поле iid, которое позволяет добраться до нужного интерфейса.
Так получается или нет? Твой же проект. У меня и похожего-то нет, чтобы проверить.
Здравствуйте Vi2, Вы писали:
Vi2>Здравствуйте bkat, Вы писали:
B>>Для этого в структуре INTERFACEINFO и есть B>>второе поле iid, которое позволяет добраться до нужного интерфейса. Vi2>Так получается или нет? Твой же проект. У меня и похожего-то нет, чтобы проверить.
В принципе получается, но подводные камни ожидаются ;)
Всем большое спасибо за идеи!
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.