Comment (et quand) fonctionne COM TreatAs?
Question
Je regardais l'accès au Registre des vsjitdebugger.exe
utilisant Moniteur et j'ai remarqué que parfois il interroge le registre de la manière suivante (quelques informations entendue rectifier):
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
Informations sur TreatAs sur les émissions de MSDN il permet de spécifier un GUID pour un autre serveur COM qui sera appelée au lieu de l'original.
Je n'ai pas pu trouver beaucoup plus d'informations sur cette clé, et je ne pouvais l'utiliser sur mon propre objet COM: J'ai deux implémentations différentes d'un même objet COM (dans 2 DLLs séparés, ayant 2 GUIDs séparés), et quand mon processus crée l'objet via GUID, je voudrais que ce pour créer l'autre objet au lieu (via GUID spécifié dans TreatAs). Malheureusement, il semble que Windows tente immédiatement de requête HKCU\Software\Classes\CLSID\{my-guid}\InprocServer32
, au lieu de la première recherche TreatAs.
Ma question est essentiellement sur les règles de TreatAs, quand et comment est-elle interrogé?
La solution
TreatAs La fonctionnalité fonctionne assez simple: avec une demande de CoCreateInstance
une instance d'un objet COM, COM sous-système vérifie la clé TreatAs et, une fois trouvé, les tentatives d'une classe de substitution / émulation et transparente retour au lieu de CLSID demandé. L'appelant, par conséquent, obtient une interface d'un objet d'émulation transparente.
La fonction est rarement utilisée, mais encore utilisé. Vous pouvez énumérer actuellement des cours de TreatAs actifs en utilisant EnumerateTreatAsClasses utilitaire. La fonction est une méthode de la classe de crochet de COM instanciation.