Me gustaría interceptar las funciones COM CoCreateInstanceEx y/o CoGetClassObject para reemplazar una clase con una cuña de prueba en una prueba unitaria. Esto solo será para un CLSID único; todos los demás pueden pasar sin cambios. ¿Hay alguna manera de hacer esto sin hacks horribles y malvados?¿Hay alguna manera de enlazar o interceptar las llamadas CoGetClassObject y/o CoCreateInstance?
Respuesta
Depende de qué es exactamente lo que quiere.
Si desea detectar quién está cargando esa clase o para encontrar si está cargada en absoluto, puede usar Process Monitor. Una llamada a CoGetClassObject()
(o CoCreateInstanceEx()
) llevará a que se lea una clave HKCR\CLSID\{Class of interest id}
y Process Monitor le mostrará qué proceso y cuándo lo hace y qué tan exitoso es.
Si desea reemplazar una clase existente con la suya, compile una biblioteca con su versión de clase con la misma identificación de clase y cambie la ruta al servidor COM dentro de HKCR\CLSID\{Class of interest id}
para que su biblioteca se use para servir una clase con esa clase carné de identidad. Puede hacerlo manualmente o con regsvr32 - primero registre la biblioteca original, luego la suya para anular la clase de registro de intereses. COM realiza la identificación de clase -> la asignación de biblioteca a través de esa clave cuando un consumidor llama al CoGetClassObject()
o CoCreateInstanceEx()
.
Desafortunadamente, no puedo estar jugando con el registro para esto; se ejecutará en un conjunto de pruebas automatizado, y la clase que pretendo anular es 'CLSID_KnownFolderManager', por lo que probablemente sea una mala idea anular eso en una manera de todo el sistema :) En el peor de los casos, podría instrumentar el código para ser probado, pero si hay una forma limpia de reemplazarlo solo por un proceso, sería bueno. – bdonlan
Primero, puede registrar la biblioteca original después de que se ejecute el conjunto de pruebas y esto restaurará la cordura. En segundo lugar, puede registrar su biblioteca modificada únicamente para el usuario actual: modifique HKCU \ Software \ Classes \ CLSID. Aparte de eso, no puedes hacer nada más o menos elegante. – sharptooth
Siempre hay la función CoTreatAsClass
: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx
Pero, como usted señaló, será un reemplazo de todo el sistema de la clase, no un cambio local.
Alternativamente, podría buscar conectar CoCreateInstance como se sugiere en la publicación mencionada por el comentario de Shay Erlichmen.
- 1. ¿Hay alguna manera de configurar Fiddler para interceptar llamadas HTTP desde un servicio de Windows?
- 2. ¿Hay alguna manera de interceptar setters y getters en C#?
- 3. ¿Hay alguna manera de hacer que TFS se pueda enlazar?
- 4. ¿Hay alguna manera de registrar o interceptar Excepciones de primera oportunidad
- 5. Cómo interceptar las llamadas al método dll?
- 6. ¿Cuál es la diferencia entre CoCreateInstance() y CoGetClassObject() al crear objetos en la misma máquina?
- 7. ¿Hay alguna manera de descubrir las principales llamadas de una función C?
- 8. Use Unity para interceptar todas las llamadas a IMyInterface.SomeMethod
- 9. Interceptar llamadas salientes al colgar
- 10. ¿Es esta una buena manera de interceptar las llamadas al sistema?
- 11. Interceptar llamadas a console.log en Chrome
- 12. Interceptar llamadas a métodos en PHP
- 13. ¿cómo podría interceptar llamadas de linux sys?
- 14. ¿Hay alguna manera de realizar llamadas remotas al servidor web de desarrollo ASP.NET?
- 15. ¿Hay alguna manera de memorizar o materializar un IEnumerable?
- 16. ¿Hay alguna manera de imitar o en genéricos de Java
- 17. Enlace a DataGridView - ¿Hay alguna manera de "enlazar" el color de fondo de una celda?
- 18. ¿Hay alguna manera de desactivar las advertencias xml?
- 19. ¿Hay alguna manera de limitar las longitudes vline en ggplot2?
- 20. ¿hay alguna manera de usar tr /// (o equivalente) en java?
- 21. ¿Hay alguna manera de usar Canvas en IE7 o IE8?
- 22. ¿Hay alguna manera de acelerar las compilaciones de WiX?
- 23. ¿Hay alguna manera de acelerar Jsoup.parse()?
- 24. ¿Hay alguna manera de obtener todas las variables en Ruby?
- 25. C#: ¿Hay alguna manera de clasificar las enumeraciones?
- 26. ¿Hay alguna manera de enumerar todas las asociaciones belongs_to?
- 27. Al depurar javascript, ¿hay alguna manera de alertar la pila de llamadas actual?
- 28. ¿Hay alguna forma de enumerar todas las llamadas de iguales() de una determinada clase con Eclipse?
- 29. ¿Hay alguna forma de anidar llamadas a patrones activos F #?
- 30. ¿Hay alguna manera de identificar las supresiones de mensajes FxCop no utilizadas o obsoletas?
Dupe: http://stackoverflow.com/questions/1505196/spying-on-com-objects –
@Shay, de hecho lo es. He votado a favor de que se cierre como un engaño, pero aparentemente no es suficiente que solo el encuestador vota para cerrar (no quiero eliminar, ya que puede ayudar a alguien a buscar en el futuro) – bdonlan
No es un duplicado . Esa pregunta es espiar en objetos COM. Esta pregunta es para pruebas unitarias. El primero intenta resolver el problema conectando CoCreateInstance, lo que no significa que tenga que ser la respuesta. Esta pregunta quiere conectar CoCreateInstance. –