Как (и когда) работает COM TreatAs? - PullRequest
5 голосов
/ 23 ноября 2010

Я просматривал доступ к реестру 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 Ответ

2 голосов
/ 16 июня 2013

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

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

...