2010-05-14 10 views
5

Una interfaz dual en COM es aquella a la que se puede acceder mediante un DispInterface o mediante métodos VTable.COM Interfaces duales

Ahora alguien puede decirme cuál es exactamente cuál es la diferencia entre los dos métodos?

Pensé que una VTable es una tabla virtual que contiene los punteros a las diferentes funciones cuando se implementa una jerarquía de clases que tiene funciones virtuales que pueden anularse en clases secundarias. Sin embargo, no veo cómo esto está relacionado con una interfaz dual en COM?

Respuesta

2

En resumen, COM es una especificación binaria, no una especificación de idioma. Realmente no hay una correlación entre las interfaces duales y las clases derivadas en el código. Manzanas y naranjas.

La VTable está "ligada a principios" y, por lo tanto, es más rápida. Conoces el tipo de método al que llamas en tiempo de compilación.

El uso de DispInterface está "atrasado" y, por lo tanto, es más lento pero más flexible. Se usa extensamente para scripting. El método y los tipos de propiedad se determinan en tiempo de ejecución.

Espero que esta breve explicación ayude.

+0

¿Qué quiere decir exactamente con 'especificación binaria'? –

+2

@Tony: Significa que COM solo trata cómo los componentes se comunican a nivel binario; no dice nada sobre cómo se desarrollan los componentes o en qué lenguaje está escrito el código o si existe una "jerarquía de clases". Consulte El modelo de objetos componentes: una descripción técnica general @ http://msdn.microsoft.com/en-us/library/ms809980.aspx –

+0

+1 para vinculación temprana versus tardía. –

3

La principal diferencia está en la forma de llamar a los métodos de objeto. En el caso de que la llamada a DispInterface pase por el método IDispatch :: Invoke (usado en scripts o en ausencia de la descripción de la interfaz), vea remarks. Este método es una segunda opción mucho más lenta. En el segundo caso, se usa directamente VTable para llamadas a métodos (usado para llamadas de C + + o .NET)

+0

Entonces, ¿el método de invocación en IDispatch se usa para invocar métodos de un script como VBScript o JScript? –

+0

@Tony Correcto: si desea que el objeto COM se pueda utilizar desde un script, necesitará una interfaz dual. –

+1

Sí, cuando llamas al método de comandos, primero llama a IDispatch :: GetIDsOfNames y luego IDispatch :: Invoke – Victor

1

Solo quiero responder a las preguntas adicionales de Tony.

Si desea crear un COM al que se pueda acceder desde VBScript/JScript o desde la antigua ASP "clásica", debe implementar IDispatch.

En Visual Basic 6 o en VBA de MS Office se puede usar de ambas formas. Si agrega Referencia a su COM, se usará "enlazado anticipado" (IUnknown o VTable). Si usa su COM en VB6 o VBA con CreateObject ("ProgIdName"), se usará "límite de retraso".

Es muy importante entender, que para hacer que COM sea accesible desde VB6/VBA ect. no es suficiente solo implemente la interfaz IUnknown. Debe crear y registrar Type Library con el atributo oleautomation. Para poder hacerlo, puede utilizar en la interfaz de su COM solo oleautomation tipos de datos compatibles (consulte http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx). Para comprender la biblioteca de tipos, desempeña un papel de administración de clientes DLL, por lo que ayuda a un software de cliente como VB6/VBA a enviar datos correctamente como parámetros a su COM. No debe olvidar, que incluso su COM será un servidor InProc, una DLL, los parámetros no serán reenviados directamente a COM, sino que deben ser calculados. Durante la recopilación de datos, se creará una copia de los datos en el hilo donde ejecuta su COM. Hace que su subproceso DLL COM esté a salvo de un lado y su COM no se bloqueará si el subproceso que llama a su método COM finalizará antes de que COM devuelva el valor.

Probablemente mi explicación sobre el cálculo de referencias no es fácil, pero es importante no olvides crear y registrar la biblioteca de tipos que es mejor guardar como un recurso dentro de COM.

Cuestiones relacionadas