2009-10-22 4 views
7

Chciałbym przechwycić funkcje COM CoCreateInstanceEx i/lub CoGetClassObject, aby zastąpić klasę podkładką testową w teście jednostkowym. Dotyczy to tylko jednego identyfikatora CLSID; wszystkie inne mogą przejść bez zmian. Czy istnieje sposób, aby to zrobić bez strasznych, złych hacków?Czy istnieje sposób przechwycenia lub przechwycenia wywołań CoGetClassObject i/lub CoCreateInstance?

+1

Dupe: http://stackoverflow.com/questions/1505196/spying-on-com-objects –

+0

@Shay, rzeczywiście tak jest. Głosowałem za tym, aby zamknąć go jako duplikat, ale najwyraźniej nie wystarczy, że pytający zamknie głosowanie (nie chcę go usuwać, ponieważ może to pomóc w wyszukiwaniu w przyszłości). – bdonlan

+0

Nie duplikat . To pytanie polega na szpiegowaniu obiektów COM. To pytanie dotyczy testów jednostkowych. Pierwsza próbowała rozwiązać problem, podpierając CoCreateInstance - co nie znaczy, że musi być odpowiedzią. To pytanie chce podpiąć CoCreateInstance. –

Odpowiedz

2

To zależy od tego, czego dokładnie chcesz.

Jeśli chcesz wykryć, kto ładuje tę klasę lub sprawdzić, czy jest załadowany, możesz użyć Process Monitor. Połączenie z numerem CoGetClassObject() (lub CoCreateInstanceEx()) spowoduje odczytanie klucza HKCR\CLSID\{Class of interest id}, a Monitor procesu pokaże Ci, jaki proces i kiedy to nastąpi oraz jak udany.

Jeśli chcesz zamienić istniejącą klasę na twoją - skompiluj bibliotekę z wersją klasy o tym samym ID klasy i zmień ścieżkę do serwera COM wewnątrz HKCR\CLSID\{Class of interest id}, aby twoja biblioteka była używana do obsługi klasy z tą klasą ID. Możesz to zrobić ręcznie lub przy pomocy regsvr32 - najpierw zarejestruj oryginalną bibliotekę, potem swoją, aby zastąpić klasę rejestracji zainteresowań. COM robi identyfikator klasy -> mapowanie biblioteki przez ten klucz, gdy konsument wywołuje CoGetClassObject() lub .

+0

Niestety, nie mogę się z tym zmierzyć - będzie działał na zautomatyzowanym pakiecie testowym, a klasa, którą zamierzam zastąpić, to 'CLSID_KnownFolderManager', więc prawdopodobnie nie jest dobrym pomysłem, aby to zmienić sposób w całym systemie :) W najgorszym przypadku mógłbym przyuczać kod do przetestowania, ale jeśli istnieje czysty sposób na zastąpienie go tylko dla jednego procesu, byłoby miło. – bdonlan

+1

Po pierwsze, możesz zarejestrować oryginalną bibliotekę po uruchomieniu zestawu testów, co przywróci spokój psychiczny. Po drugie, możesz zarejestrować zmodyfikowaną bibliotekę tylko dla bieżącego użytkownika - zmodyfikuj HKCU \ Software \ Classes \ CLSID. Poza tym nie można zrobić nic bardziej lub mniej eleganckiego. – sharptooth

3

Zawsze jest CoTreatAsClass funkcja: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

Ale, jak pan zauważył, że będzie to wymiana całego systemu klasy, a nie zmiana lokalna.

Alternatywnie, możesz przyjrzeć się podpięciu CoCreateInstance zgodnie z sugestią zamieszczoną w komentarzu Shay Erlichmen.

Powiązane problemy