2009-10-22 12 views
7

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?

+1

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

+0

@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

+0

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. –

Respuesta

2

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().

+0

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

+1

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

3

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.

Cuestiones relacionadas