2014-11-25 4 views
2

Есть ли способ отслеживать и записывать COM-вызовы с параметрами, выполненными в конкретный модуль EXE/DLL, без явного добавления функций ведения журнала к самому модулю? Я думаю о том, как вы можете отслеживать сообщения Windows в Spy ++, но для COM.Как я могу записать [D] COM-вызовы в модуль?

Мотивация заключается в записи вызовов для диагностических и автоматизированных целей тестирования - например, нажмите кнопку в окне на клиентском ПК, следите за COM-вызовами, отправленными на серверный модуль, а затем «повторно воспроизводите» эти вызовы без необходимости использования клиентского ПК.

Если существуют инструменты, которые делают это, это здорово. Если нет, это то, что можно написать, и если да, то как?

ответ

2

Caller of COM method просто вызывает функцию с согласованным соглашением. параметры и т. д., и между вызывающим и вызывающим абонентом отсутствует средний уровень, за исключением случаев, когда пары прокси/заглушки маршируют вызов. Даже в последнем случае существует стандартный способ перехвата вызова для ведения журнала, который вы можете сделать без конкретных видов подготовки. В целом, вам необходимо позаботиться о том, чтобы отслеживать звонки и диагностировать себя. In может направлять ведение журнала в прологе каждого интересующего метода или вы можете обернуть ваш объект/интерфейс в настроенный средний слой, который отслеживает вызов и передает его дальше намеченному адресу (например, описанному here).

+0

Ах, COM компилируется прямо на голосовые вызовы, поэтому нет ничего, что можно было бы перехватить сообщениями. Спасибо за эту ссылку. Правильно ли я думаю, что прокси-сервер может быть предоставлен в полностью отдельном модуле без изменения оригинала - он не обращает внимания на прокси? Я полагаю, что то, что мне действительно нужно, - это автогенерировать прокси-серверы из моего IDL для интерфейсов COM, которые меня интересуют, - насколько это возможно? –

+0

Если вы создаете универсальный прокси-сервер, вы все равно должны его бросить где-то в реальном коде, например. метод вернет прокси вместо обычного указателя интерфейса. Я имею в виду, что даже если прокси-сервер, который охватывает множество вещей, может быть выполнен, модуль, который нужно отслеживать, должен иметь некоторый код для интеграции этого прокси-сервера. Вы должны посмотреть на это следующим образом: мой код работает через указатели и методы, следуя некоторым соглашениям, сужающим разнообразие возможных вызовов в определенной степени. Как я могу универсально регистрировать вызовы. По-видимому, задача не так просто, как просто что-то сделать. –

+0

Простите меня, работая над точкой, но вы говорите, что крюк для звонков, таких как CoCreateInstance, должен быть в том же модуле, что и классы COM? Или я могу создать совершенно новое приложение, которое имеет глобальный крючок, и создает прокси для определенных IID? –