2010-08-23 14 views

Respuesta

4

Al igual que otros han mencionado, la única manera es utilizar QueryInterface para todas las interfaces posibles. Y esto es exactamente lo que la herramienta de Microsoft OleView hace por ti.

1

De ninguna manera. La idea detrás de las interfaces COM es que le preguntes al objeto: "por favor dame la interfaz XYZ si la soportas" y el objeto decide cómo responder, proporciona la referencia a sí mismo o muestra la interfaz de algún objeto interno, etc. Así que puedes " t saber qué interfaces el objeto "admite" sin preguntar al objeto como se describió anteriormente. Esta fue la decisión de diseño de los diseñadores COM.

2

Desafortunadamente, eso no es algo para lo que esté COM. En el nivel COM básico, puede simplemente ask an object whether it supports una interfaz específica identificada por UUID, una a la vez. Dado que hay muchos UUID potenciales, obtener una lista exhaustiva de esa manera tomaría bastante tiempo. Aunque la mayoría de las implementaciones de objetos rastrearían internamente la lista de interfaces compatibles, existe no existe una forma COM estándar de acceder a esas listas desde el exterior. Y aunque las hubiera, solo se podía obtener un nombre programático de la interfaz al buscar su UUID en el registro, que no siempre es confiable.

ActiveX objects (a tricky term!) tienden a admitir la automatización a través de IDispatch. Si los objetos se comportan bien, podrá get some information on the methods que admiten a través de GetTypeInfo(). Este no incluirá los nombres de las interfaces (si las hay) a las que pertenecen los métodos.

En resumen, COM es bastante pobre en metadatos de objeto.

+0

Gracias por la respuesta muy detallada. Sin embargo, estaba buscando una solución práctica que la respuesta de Paul me proporcionó, así que la acepté. –

Cuestiones relacionadas