Как (и когда) работает COM TreatAs?

Я смотрел на доступ к реестру vsjitdebugger.exe используя Process Monitor, и я заметил, что иногда он запрашивает реестр следующим образом (некоторая информация опущена):

HKCU\Software\Classes\CLSID\{some-guid} NAME NOT FOUND  Desired Access: Read
...
HKCU\Software\Classes\CLSID\{some-guid}\TreatAs NAME NOT FOUND  Desired Access: Query Value
...
HKCU\Software\Classes\CLSID\{some-guid}\InprocServer32  NAME NOT FOUND  Desired Access: Read
...
HKCR\CLSID\{24E669E1-E90F-4595-A012-B0FD3CCC5C5A}\InprocServer32    SUCCESS Desired Access: Read

Информация о TreatAs на MSDN показывает, что он позволяет указывать GUID для другого COM-сервера, который будет вызываться вместо исходного.

Мне не удалось найти гораздо больше информации об этом ключе, и я не смог использовать его на своем собственном COM-объекте: у меня есть две разные реализации одного и того же COM-объекта (в 2 отдельных DLL, с 2 отдельными GUID) и когда мой процесс создает объект через GUID, я бы хотел, чтобы он вместо этого создал другой объект (через GUID, указанный в TreatAs). К сожалению, похоже, что Windows сразу пытается запросить HKCU\Software\Classes\CLSID\{my-guid}\InprocServer32вместо того, чтобы сначала искать TreatAs.

Мой вопрос в основном о правилах TreatAs, когда и как его запрашивают?

1 ответ

Решение

Функция TreatAs работает довольно просто: с запросом CoCreateInstance экземпляр COM-объекта подсистема COM проверяет наличие ключа TreatAs и, при обнаружении, пытается создать экземпляр класса замещения / эмуляции и прозрачно вернуть его вместо запрошенного CLSID. Таким образом, вызывающая сторона получает интерфейс объекта эмуляции прозрачно.

Эта функция используется редко, но все еще используется. Вы можете перечислить активные в данный момент классы TreatAs с помощью утилиты EnumerateTreatAsClasses. Эта функция является одним из методов перехватывания экземпляров COM-класса.

Другие вопросы по тегам