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?
Czy istnieje sposób przechwycenia lub przechwycenia wywołań CoGetClassObject i/lub CoCreateInstance?
Odpowiedz
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 .
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
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
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.
- 1. Właściwy sposób przechwycenia wyjątku od JSON.parse
- 2. Czy istnieje sposób przechwycenia wydruku wydruku podprogramu do zmiennej, aby zamiast tego wysłać go na stderr?
- 3. Czy istnieje sposób przechwycenia wszystkich wyjątków (nawet tych obsługiwanych) za pomocą JCLDebug?
- 4. Jak czytać/przechwycenia wiadomości USSD pochodzących z telefonu Android
- 5. Konieczność przechwycenia zdarzeń klawiatury HID (a następnie ich zablokowanie)
- 6. lambdas wymagają przechwycenia "tego", aby wywołać funkcję statycznego członka?
- 7. Wykonywanie zrzutów ekranu programowo nie powoduje przechwycenia zawartości surfaceVIew
- 8. Które zdarzenie do przechwycenia dla aplikacji zostało zamknięte?
- 9. Jaka jest różnica między CoCreateInstance() i CoGetClassObject() podczas tworzenia obiektów na tym samym komputerze?
- 10. Czy istnieje czysty sposób testowania wywołań zwrotnych ActiveRecord w Rspec?
- 11. Jak przeładować konwersję typu Groovy w celu uniknięcia próby/przechwycenia wyjątku NumberFormatException?
- 12. Debuguj i unikaj okresowego błędu REBOL2, który próba [] nie powoduje (?) Przechwycenia?
- 13. Szybkie przechwytywanie stosu wywołań
- 14. OCMock - weryfikacja kolejności wywołań metod. Czy jest jakiś inny sposób?
- 15. Czy istnieje narzędzie do wizualizacji wywołań metod w języku Python?
- 16. Czy istnieje prosty lub piękny sposób na odwrócenie ciągu znaków?
- 17. golang: Czy istnieje sposób iteracji w określonym miesiącu lub tygodniu?
- 18. Czy istnieje sposób zmiany pozycji tekstu w UITabBar lub UITabBarItem?
- 19. Czy istnieje sposób na zapamiętanie lub zmaterializowanie IEnumerable?
- 20. Czy istnieje sposób przekazywania uczestników do NUnit TestCase lub TestFixture?
- 21. Czy istnieje sposób porównania dwóch różnic lub poprawek?
- 22. Czy istnieje sposób na użycie Canvas w IE7 lub IE8?
- 23. Szybki sposób na wykrycie, czy istnieje tabela lub widok DataContext
- 24. Czy istnieje sposób, aby skomentować lub lepiej zorganizować plik bower.json?
- 25. Korzystanie z JSF 2.0/Facelets, czy istnieje sposób na dołączenie globalnego detektora do wszystkich wywołań AJAX?
- 26. Jeśli istnieje lub istnieje?
- 27. Jak sprawdzić, czy klasa Java jest abstrakcyjna?
- 28. Czy istnieje sposób szyfrowania w jQuery?
- 29. Czy istnieje właściwy sposób na usunięcie httpwebrequest?
- 30. Czy istnieje lepszy sposób zarządzania zlokalizowanymi ciągami?
Dupe: http://stackoverflow.com/questions/1505196/spying-on-com-objects –
@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
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. –