Je souhaite intercepter les fonctions COM CoCreateInstanceEx et/ou 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 inaperçus. Y a-t-il un moyen de le faire sans horribles hacks?Existe-t-il un moyen de connecter ou d'intercepter des appels CoGetClassObject et/ou CoCreateInstance?
Répondre
Cela dépend de ce que vous voulez exactement.
Si vous souhaitez détecter qui charge cette classe ou pour déterminer si elle est chargée, vous pouvez utiliser Process Monitor. Un appel à CoGetClassObject()
(ou CoCreateInstanceEx()
) conduira à une clé HKCR\CLSID\{Class of interest id}
en cours de lecture et Process Monitor vous montrera quel processus et quand est-ce et avec quel succès. Si vous souhaitez remplacer une classe existante par la vôtre - compilez une bibliothèque avec votre version de classe avec le même ID de classe et modifiez le chemin d'accès au serveur COM à l'intérieur de HKCR\CLSID\{Class of interest id}
afin que votre bibliothèque soit utilisée pour servir une classe avec cette id. Vous pouvez le faire manuellement ou avec regsvr32 - d'abord enregistrer la bibliothèque originale, puis la vôtre pour remplacer la classe d'intérêt registartion. COM fait classe ID -> mappage de bibliothèque via cette clé lorsqu'un consommateur appelle CoGetClassObject()
ou CoCreateInstanceEx()
.
Malheureusement, je ne peux pas me tromper avec le registre pour cela - il fonctionnera sur une suite de tests automatisée, et la classe que j'ai l'intention de remplacer est CLSID_KnownFolderManager, donc c'est probablement une mauvaise idée de surcharger cela dans Dans le pire des cas, je pourrais instrumenter le code à tester, mais s'il y a une manière propre de le remplacer juste pour un processus, ce serait bien. – bdonlan
D'abord, vous pouvez enregistrer la bibliothèque d'origine après l'exécution de la suite de tests, ce qui rétablira la santé mentale. Deuxièmement, vous pouvez enregistrer votre bibliothèque modifiée pour l'utilisateur actuel uniquement - modifiez HKCU \ Software \ Classes \ CLSID. A part ça, vous ne pouvez rien faire de plus ou de moins élégant. – sharptooth
Il y a toujours la fonction CoTreatAsClass
: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx
Mais, comme vous l'avez dit, ce sera un remplacement du système à l'échelle de la classe, et non pas un changement au niveau local. Alternativement, vous pouvez vous intéresser à l'accrochage de CoCreateInstance comme suggéré dans le post référencé par le commentaire de Shay Erlichmen.
Dupe: http://stackoverflow.com/questions/1505196/spying-on-com-objects –
@Shay, en effet, il est. J'ai voté pour qu'il soit fermé comme un dupe, mais apparemment il ne suffit pas que le questionneur vote pour fermer (je ne veux pas le supprimer, car cela pourrait aider quelqu'un à chercher dans le futur) – bdonlan
Pas un doublon . Cette question est espionnage sur les objets COM. Cette question concerne les tests unitaires. Le premier essaie de résoudre le problème en accrochant CoCreateInstance - ce qui ne veut pas dire que ça doit être la réponse. Cette question veut accrocher CoCreateInstance. –