Могу ли я получить функциональные указатели для перехвата через COM Dispatch Interface?(не двойной интерфейс) - PullRequest
0 голосов
/ 24 мая 2011

Могу я спросить кое-что о методе перехвата в интерфейсе 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.

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

Спасибо.

1 Ответ

0 голосов
/ 24 мая 2011

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

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

Мартын

...