Могу ли я получить указатели на функции для подключения из диспетчерского интерфейса COM? (не двойной интерфейс)

Могу я спросить кое-что о методе подключения в интерфейсе COM Distach?

Недавно я делаю какую-то утилиту, которая является своего рода инструментом для мониторинга COM.

и я пытаюсь перехватить интерфейс объекта Com во время работы.

для этого мне нужно было использовать тип lib.

Ниже приведены мои коды.

// Load Type Lib.
LoadRegTypeLib( TypeLibCLSID , wMajorVersion , wMinorVersion , lcid  , &pTypeLib );

// Get Function Descriptor
pInterfaceTypeInfo->GetFuncDesc( iii , &pfuncdesc );

// Create Instance and Get Interface
CoCreateInstance( pClassAttr->guid , NULL, ClassContext,  pInterfaceAttr->guid , (void**)&pUnknownObject );

// Get VTable
dwOrgFunctionPointer = *(DWORD*)pUnknownObject;

// adjust offset
dwOrgFunctionPointer += pfuncdesc->oVft;

// Get Function Pointer
dwOrgFunctionPointer = *(DWORD*)dwOrgFunctionPointer ;

// Hook
MyHookMethod( dwOrgFunctionPointer );

Это было успешно, пока я не нашел какой-то Com-объект с диспетчерским интерфейсом (не двойным).

Если какой-то Com-объект имеет только диспетчерский интерфейс (не двойной), в VTable нет указателей на функции.

Есть только указатели функций MFC, такие как GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke.

более того, pfuncdesc-> oVft всегда равно 0 для всех функций, принадлежащих этому интерфейсу.

Я знаю, что я должен использовать метод Invoke, когда использую такие объекты com.

Но проблема в том, что я пытаюсь зацепить. Мне нужны указатели на функции.

Как я могу получить эти указатели на функции из IDispatch?

В IDispatch-> vtable есть только указатели функций MFC.

любой совет будет оценен.

Спасибо.


person Darpangs    schedule 24.05.2011    source источник
comment
Это невозможно, IDispatch использует позднее связывание. Кроме методов IDispatch, зацепить нечего. Реализация сервера может быть такой же простой, как оператор switch для dispid.   -  person Hans Passant    schedule 24.05.2011
comment
хм ... есть ли возможность? когда я использую отладчик, я видел некоторые коды, такие как класс COleDispatchImpl, метод GetDispEntry, класс CCmdTarget в методе Invoke. Я предполагаю, что для этого метода Invoke может быть какая-то таблица функций. С этим ничего нет? в любом случае спасибо за ваш комментарий.   -  person Darpangs    schedule 24.05.2011


Ответы (1)


Чтобы подключить IDispatch, вы можете подключить / совместить все методы IDispatch, вероятно, сосредоточившись в основном на Invoke. Важно помнить, что IDispatch - это особый интерфейс. Хотя правила COM гарантируют, что QI для IID_IDispatch возвращает единственную реализацию, другие интерфейсы, производные от IDispatch, могут иметь собственные отдельные реализации Invoke et al. Это означает, что приведение к IDispatch может дать отличные от QI результаты для него. Я нахожу такое поведение запутанным, но некоторые классические сценарии AX требуют этого.

Сказав это, я настоятельно рекомендую не подключаться таким образом, за исключением, возможно, целей отладки. Не отправляйте код, который работает таким образом, в код реального приложения. Получится очень нестабильно.

Мартын

person Martyn Lovell    schedule 24.05.2011
comment
Спасибо за ваш совет. на самом деле, я рассматриваю этот метод перехвата «Invoke», как вы упомянули. и я запомню вашу рекомендацию. - person Darpangs; 24.05.2011