¿Hay alguna forma de enganchar o interceptar llamadas de CoGetClassObject y / o CoCreateInstance?

StackOverflow https://stackoverflow.com/questions/1604913

Pregunta

Me gustaría interceptar el COM CoCreateInstanceEx y / o CoGetClassObject para reemplazar una clase con un calzo de prueba en una prueba de unidad. Esto será solo para un único CLSID; Todos los demás pueden pasar sin cambios. ¿Hay una manera de hacer esto sin horribles, malos trucos?

¿Fue útil?

Solución

Depende de lo que quieras exactamente.

Si desea detectar quién está cargando esa clase o saber si está cargada, puede usar Monitor de proceso . Una llamada a CoGetClassObject () (o CoCreateInstanceEx () ) dará lugar a la lectura de una clave HKCR \ CLSID \ {Id. De clase de interés} y Process Monitor le mostrará qué proceso, 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 el mismo ID de clase y cambie la ruta al servidor COM dentro de HKCR \ CLSID \ {ID de clase de interés} para que su biblioteca se use para servir una clase con ese id. Puede hacerlo manualmente o con regsvr32: primero registre la biblioteca original, luego la suya para anular el registro de la clase de interés. COM hace la identificación de la clase - > la biblioteca se asigna a través de esa clave cuando un consumidor llama a CoGetClassObject () o CoCreateInstanceEx () .

Otros consejos

Siempre existe la función CoTreatAsClass : http://msdn.microsoft.com/en-us /library/ms693452(VS.85).aspx

Pero, como notó, será un reemplazo de la clase en todo el sistema, no un cambio local.

Alternativamente, puedes mirar a CoCreateInstance como se sugiere en la publicación a la que hace referencia el comentario de Shay Erlichmen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top