Нет способа проверять наличие COM-объектов. Как только они создаются - они просто фрагменты памяти, на которые ссылается что-то другое (переменные указателя интерфейса члена и т. Д.).
Иногда объекты помещаются в таблицу запущенных объектов (ROT
), и вы можете получить их оттуда, как уже предлагалось в комментариях. Эти атрибуты, скажем, для <1% экземпляров COM-объектов, но, может быть, вам повезло, что вы ищете именно их. </p>
Единственный способ, о котором я могу думать, - это подключить создание экземпляров COM-объекта, чтобы вы перехватили создание и затем смогли отследить свой собственный список существующих экземпляров. Это тоже нелегкий путь (и, скорее всего, небезопасный).
Чтобы достичь этого, вам нужно либо зарегистрировать ваш объект класса в контексте запущенного процесса на интересующий вас CLSID
, и ваша фабрика классов получит вызовы экземпляра. Или подключите CoCreateInstance
API, например, с Detours
.
Как только вы перехватываете инстанцирование, у вас появляются указатели в момент создания объекта, и вам снова нужно что-то с ними делать. Возможно, вы захотите перенаправить эти вызовы экземпляров в исходный API, а затем отследить время жизни экземпляров - если вы добавите дополнительную ссылку на объект, вы, вероятно, измените исходное поведение приложения. В противном случае, вы не можете перехватить освобождение COM-объекта. Иногда COM-классы можно создавать агрегированно, и вы можете более или менее корректно встроить исходный экземпляр в ваш COM-объект.
В общем, в целом задача не представляется выполнимой. Имея определенный CLSID
интерес, определенную удачу и немало усилий, вы, возможно, преуспеете в этом.