Есть ли способ перехватить или перехватить вызовы CoGetClassObject и / или CoCreateInstance? - PullRequest
7 голосов
/ 22 октября 2009

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

Ответы [ 2 ]

3 голосов
/ 22 октября 2009

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

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

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

2 голосов
/ 22 октября 2009

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

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

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

...