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

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

2 ответов


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

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

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


всегда : http://msdn.microsoft.com/en-us/library/ms693452 (VS.85).aspx

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

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