Идентификация / перечисление COM-объектов и свойств из стороннего программного обеспечения - PullRequest
9 голосов
/ 29 марта 2012

Я пытаюсь разработать приложение, которое может идентифицировать COM-объекты и их свойства в любом другом приложении.Это моя первая попытка сделать это, и я не уверен, с чего начать.В идеале это было бы сделано с использованием Delphi XE2, но я открыт для предложений.

Если у меня есть CLSID, есть ли какой-нибудь способ «просканировать» работающее приложение на предмет наличия каких-либо объектов?Или, если пойти по-другому, есть ли лучший способ составить список / найти активные объекты в любом работающем приложении?

Мы высоко ценим любую помощь, а также любые указания на хорошую документацию по теме.

Редактировать: На самом деле проблема заключается в обнаружении COM-объектов в любом другом приложении, перечислении свойств и всем остальном, что мне нужно, на другие вопросы уже дан ответ.

1 Ответ

6 голосов
/ 01 апреля 2012

Нет способа проверять наличие COM-объектов. Как только они создаются - они просто фрагменты памяти, на которые ссылается что-то другое (переменные указателя интерфейса члена и т. Д.).

Иногда объекты помещаются в таблицу запущенных объектов (ROT), и вы можете получить их оттуда, как уже предлагалось в комментариях. Эти атрибуты, скажем, для <1% экземпляров COM-объектов, но, может быть, вам повезло, что вы ищете именно их. </p>

Единственный способ, о котором я могу думать, - это подключить создание экземпляров COM-объекта, чтобы вы перехватили создание и затем смогли отследить свой собственный список существующих экземпляров. Это тоже нелегкий путь (и, скорее всего, небезопасный).

Чтобы достичь этого, вам нужно либо зарегистрировать ваш объект класса в контексте запущенного процесса на интересующий вас CLSID, и ваша фабрика классов получит вызовы экземпляра. Или подключите CoCreateInstance API, например, с Detours.

Как только вы перехватываете инстанцирование, у вас появляются указатели в момент создания объекта, и вам снова нужно что-то с ними делать. Возможно, вы захотите перенаправить эти вызовы экземпляров в исходный API, а затем отследить время жизни экземпляров - если вы добавите дополнительную ссылку на объект, вы, вероятно, измените исходное поведение приложения. В противном случае, вы не можете перехватить освобождение COM-объекта. Иногда COM-классы можно создавать агрегированно, и вы можете более или менее корректно встроить исходный экземпляр в ваш COM-объект.

В общем, в целом задача не представляется выполнимой. Имея определенный CLSID интерес, определенную удачу и немало усилий, вы, возможно, преуспеете в этом.

...