Existe-t-il un moyen de connecter ou d'intercepter les appels CoGetClassObject et / ou CoCreateInstance?
-
05-07-2019 - |
Question
Je voudrais intercepter la commande CoCreateInstanceEx et / ou fonctions CoGetClassObject pour remplacer une classe par une cale de test dans un test unitaire. Ce ne sera que pour un seul CLSID; tous les autres peuvent passer sans changement. Y a-t-il un moyen de faire cela sans horribles pirates?
La solution
Cela dépend de ce que vous voulez exactement.
Si vous voulez savoir qui charge cette classe ou pour savoir si elle est chargée, vous pouvez utiliser Moniteur de processus . Un appel à CoGetClassObject ()
(ou CoCreateInstanceEx ()
) mènera à une clé HKCR \ CLSID \ {Classe d'intérêt id}
en cours de lecture et Process Monitor vous montrera quel processus, quand et comment il fonctionne.
Si vous souhaitez remplacer une classe existante par la vôtre - compilez une bibliothèque avec votre version de classe avec le même identifiant de classe et modifiez le chemin d'accès au serveur COM à l'intérieur de HKCR \ CLSID \ {Identifiant de classe d'intérêt}
afin que votre bibliothèque soit utilisée pour servir une classe avec cet identifiant. Vous pouvez le faire manuellement ou avec regsvr32 - enregistrez d'abord la bibliothèque d'origine, puis le vôtre pour remplacer la classe de la classe d'intérêt. COM fait classe id - > Mappage de bibliothèque par cette clé lorsqu'un consommateur appelle CoGetClassObject ()
ou CoCreateInstanceEx ()
.
Autres conseils
Il y a toujours la fonction CoTreatAsClass
:
http://msdn.microsoft.com/en-us /library/ms693452(VS.85).aspx
Mais, comme vous l'avez indiqué, ce sera un remplacement de la classe à l'échelle du système, pas un changement local.
Vous pouvez également envisager de suspendre CoCreateInstance comme suggéré dans le message référencé par le commentaire de Shay Erlichmen.