Перенаправление CoCreateInstance на фальшивую реализацию - PullRequest
2 голосов
/ 04 июня 2019

Учитывая некоторый существующий код, который вызывает CoCreateInstance для создания экземпляров зарегистрированных COM-объектов, есть ли способ перенаправить эти вызовы для создания другого экземпляра вместо этого?

Идея заключается в том, что внутри одного и того же процесса (для целей тестирования) и без изменения исходного кода или влияния на другие процессы, когда он запрашивает предоставленную системой CLSID_ShellLink (например), он создаст экземпляр пользовательского типа (реализованный в той же базе кода), который реализуеттот же интерфейс, а не «реальный» экземпляр, который он обычно создает.

Для пояснения: я ищу вызов API, который можно сделать, чтобы сказать «эй CoCreateInstance, вызовите эту локальную вещь длясначала создайте экземпляр, прежде чем смотреть на регистрации ».И это должно быть что-то, что можно сделать программно, а не манипулируя реестром или файлом конфигурации;он должен быть переключаемым в коде.

Ответы [ 4 ]

2 голосов
/ 04 июня 2019

Если создаваемые вами объекты находятся в процессе и если вы можете вызывать CoRegisterClassObject в процессе, о котором вы говорите, вы можете зарегистрировать собственную фабрику классов для указанного объекта ... зависит также от флагов, используемых при вызове CoCreateInstance.

1 голос
/ 04 июня 2019

Я оставлю это открытым еще ненадолго, на случай, если кто-нибудь знает Правильный путь ™, чтобы сделать это в самом COM.

Один из упомянутых методов xMRi выше и особенно полезен, когда вам нужно переопределить создание экземпляров в рамках видимости.

Другой истинный COM-метод заключается в использовании эмуляции «рассматривать как». Функция CoTreatAsClass в MSDN включает в себя сам API, а в разделе «Примечания» приводится хорошее описание.

Если этот параметр включен, запросы на CoCreateInstance для данного CLSID будут перенаправлены на новую эмуляцию CLSID.

1 голос
/ 04 июня 2019

Это казалось чем-то вроде того, что COM реализовал бы внутри, так как у него были таблицы поиска и ловушки удаленного компьютера и всякие другие странные и замечательные вещи. Это просто объектная фабрика другого типа.

По крайней мере, на данный момент, я только что использовал перехватчик API, чтобы перехватить CoCreateInstance и перенаправить его на пользовательскую функцию. Это работает.

Я оставлю это открытым еще ненадолго, если кто-нибудь знает Правильный путь ™, чтобы сделать это в самом COM.

0 голосов
/ 04 июня 2019

Поскольку создание COM основано на регистрации CLSID, вы можете перезаписать известный CLSID своим собственным прокси-классом. Это, однако, не поддерживается и может привести к неопределенному поведению. Кроме того, это будет зависеть от способа вызова CoCreateInstance (перечисление CLSCTX).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...