2009-12-30 8 views
6

Tengo entendido que crear un objeto COM que agregue un objeto COM existente implica la implementación de la lógica de redirección en el método IUnknown.QueryInterface del objeto externo.Agregación COM administrada

La pregunta que tengo es cómo hacerlo si el objeto que está construyendo está gestionado. En objetos administrados, IUnknown no está implementado explícitamente. COM Interop lo hace por usted. Entonces, ¿cómo le digo a COM Interop que el objeto que construyo es una agregación de otro objeto COM?

Hasta ahora, la única forma que he encontrado es implementar todas las interfaces del objeto interno en el exterior y redirigirlas explícitamente. Esto es a) feo yb) supone que conoce todas las interfaces para implementar, lo que no es el caso en mi situación.

¿Alguna idea?

Respuesta

7

Si está utilizando .NET 4, puede usar ICustomQueryInterface para anular la lógica predeterminada IUnknown.QueryInterface. Hay una sample for COM aggregation en CodePlex - la aplicación es bastante sencilla:

CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out IntPtr ppv) 
{ 
    if(iid.Equals(new Guid("00000000-0000-0000-0000-0000000"))) 
    { 
     ppv = Marshal.GetComInterfaceForObject(this.innerObject, typeof(IInnerInterface), CustomQueryInterfaceMode.Ignore); 
     return CustomQueryInterfaceResult.Handled; 
    } 
    ppv = IntPtr.Zero; 
    return CustomQueryInterfaceResult.NotHandled; 
} 
+1

Bueno, esto es bueno saber, pero por ahora mi objetivo es de 3,5 – mfeingold

+0

cómo implementar la interfaz COM requerido correctamente? GetComInterfaceForObject no falla, pero IRibbonExtensibility.GetCustomUI nunca recibe una llamada. Mi pregunta: http://stackoverflow.com/questions/15921925/requirements-for-com-aggregate-my-custom-iribbonextensibility-implementation – sputnik

Cuestiones relacionadas