2009-11-19 2 views
3

Есть ли доступный инструмент, который перехватывает Windows COM runtime? Я хочу видеть все экземпляры, которые создаются, просматривать запросы к их интерфейсам, вызовы методов и т. Д.Захват окон COM runtime

Спасибо!

ответ

4

Вы можете попробовать Jonas Бланк-х COMTrace - Я не уверен, если он работает на Windows 7, но это стоит попробовать.

+0

Отличная вещь. Интерфейс не идеален, но сама вещь работает. – sharptooth

0

С COM-серверами Pro-proc почти ничего не стоит подцепить - потребитель вызывает CoCreateInstance() или CoGetClassObject(), и это все, что он делает. Все остальное выполняется внутри реализации COM-объекта. Возможно, вам захочется взглянуть на источники ATL, чтобы увидеть, как он обычно работает внутри - например, когда потребитель вызывает QueryInterface(), вызов напрямую переходит к соответствующему объекту, и сам объект является единственным объектом для наблюдения за вызовом.

Это не очень удачно, но является прямым следствием того, как реализованы COM-серверы proc. Разработчик может использовать Process Monitor, чтобы заметить обращения к реестру, соответствующие обнаружению сопоставления ClassId-> Dll и обширной трассировке внутри COM-объекта, чтобы узнать, что происходит. У ATL есть куча полезных материалов (например, макроса COM_INTERFACE_ENTRY_FUNC_BLIND) для включения трассировки.

+0

Но не CoCreateInstance реализован стандартной библиотекой времени выполнения COM? Если он не статически связан с сервером, мы должны глобально подключить эту функцию. А как насчет серверов? Все вызовы потребителей к их методам сортируются, так что, конечно, есть способ перехватить эти вызовы? – Danra

+0

Я не знаю, как это сделать. Конечно, вы можете подключиться к DLL-файлу, который реализует CoCreateInstance(), но это не элегантное и простое решение. – sharptooth

+0

Я чувствую, что отлично вписывается в библиотеку COM, так как это то, что я хочу делать :) Я просто не знаю ни одного инструмента, который делает этот захват, и отлично отображает результаты, стиль spy ++ (кроме обработка COM-объектов, а не окон). – Danra

1

Отъезд http://www.nektra.com/products/com-spy-console, это бесплатно.

+0

Выглядит многообещающе, перечисляет все зарегистрированные интерфейсы и отображает методы, поддерживаемые IDispatch. Тем не менее, фактическая функция подключения не работала для меня, возможно, потому, что я использую Windows 7 (не работал, даже когда я запускал монитор в качестве администратора). Перечисленная версия 0.1, поэтому было бы неудивительно, если функция * some * отсутствует. В любом случае, я постараюсь скоро на Windows XP, надеется, что он хорошо работает там! – Danra

+0

Кажется, не работает вообще для меня ... Просто перечисляет интерфейсы, установленные в реестре. – Danra

1

Чтобы отслеживать все, что вам нужно, вам нужно подключиться к системным DLL и ввести в порядок ваши слепые делегаты на запрошенных интерфейсах. Само собой разумеется, насколько сложна и подвержена ошибкам эта задача, особенно если учесть, что многие разработчики не точно следуют принципам COM. Хотя, некоторые приложения делают это в своих целях, не раскрывая эту функциональность.

Если вы действительно хотите, чтобы идти по этому пути - посмотрите на них:

+0

Я не думаю, что вы знаете инструмент стиля sysinternals, который делает это?:) – Danra

+0

прав, я не знаю. Кажется, что com-spy-консоль, упомянутая Hernán, делает именно эту вещь, возможно, стоит попросить их о поддержке Win7. – Andrey