Есть ли способ перехватить вызовы CoGetClassObject и / или CoCreateInstance?

StackOverflow https://stackoverflow.com/questions/1604913

Вопрос

Я бы хотел перехватить сообщение CoCreateInstanceEx - Совместное создание и/или Когетклассный объект функции для замены класса тестовой прокладкой в модульном тестировании.Это будет только для одного CLSID;все остальные могут пройти без изменений.Есть ли способ сделать это без ужасных, злобных взломов?

Это было полезно?

Решение

Это зависит от того, чего именно вы хотите.

Если вы хотите определить, кто загружает этот класс, или определить, загружен ли он вообще, вы можете использовать Монитор процесса.Призыв к CoGetClassObject() (или CoCreateInstanceEx()) приведет к HKCR\CLSID\{Class of interest id} считываемый ключ и Process Monitor покажут вам, какой процесс и когда это делает и насколько он успешен.

Если вы хотите заменить существующий класс своим - скомпилируйте библиотеку с вашей версией class с тем же идентификатором класса и измените путь к COM-серверу внутри HKCR\CLSID\{Class of interest id} таким образом, ваша библиотека используется для обслуживания класса с этим идентификатором.Вы можете сделать это вручную или с помощью regsvr32 - сначала зарегистрируйте исходную библиотеку, затем свою, чтобы переопределить интересующий вас класс registartion.COM выполняет сопоставление идентификатора класса -> библиотеки с помощью этого ключа, когда пользователь вызывает CoGetClassObject() или CoCreateInstanceEx().

Другие советы

Всегда есть CoTreatAsClass функция:http://msdn.microsoft.com/en-us/library/ms693452 (ПРОТИВ 85).aspx

Но, как вы отметили, это будет общесистемная замена класса, а не локальное изменение.

В качестве альтернативы, вы могли бы изучить возможность подключения CoCreateInstance, как предложено в сообщении, на которое ссылается комментарий Шей Эрлихмен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top