2010-05-14 5 views
5

Eine duale Schnittstelle in COM ist eine Schnittstelle, die über eine DispInterface- oder VTable-Methode zugänglich ist.COM Dual Interfaces

Jetzt kann mir jemand sagen, was genau ist der Unterschied zwischen den beiden Methoden?

Ich dachte, dass eine VTable eine virtuelle Tabelle ist, die die Zeiger auf die verschiedenen Funktionen enthält, wenn eine Klassenhierarchie mit virtuellen Funktionen implementiert wird, die in untergeordneten Klassen überschrieben werden können. Allerdings sehe ich nicht, wie dies mit einer Dual-Schnittstelle in COM zusammenhängt?

Antwort

2

Kurz gesagt, COM ist binäre Spezifikation, keine Sprachspezifikation. Es gibt wirklich keine Korrelation zwischen dualen Schnittstellen und dem Ableiten von Klassen im Code. Äpfel und Orangen.

Die VTable ist "früh gebunden" und daher schneller. Sie kennen den Methodentyp, den Sie zur Kompilierzeit aufrufen.

Die Verwendung der DispInterface ist "spät gebunden" und ist daher langsamer, aber flexibler. Es wird weitgehend für Skripts verwendet. Die Methoden- und Eigenschaftstypen werden zur Laufzeit festgelegt.

Ich hoffe, diese kurze Erklärung hilft.

+0

Was genau meinen Sie mit 'binäre Spezifikation'? –

+2

@Tony: Es bedeutet, dass COM nur anspricht, wie Komponenten auf einer binären Ebene kommunizieren - es sagt nichts darüber aus, wie die Komponenten entwickelt werden oder in welcher Sprache der Code geschrieben ist oder ob es eine "Klassenhierarchie" gibt. Siehe das Komponentenobjektmodell: Eine technische Übersicht @ http://msdn.microsoft.com/de-de/library/ms809980.Aspx –

+0

+1 für frühe vs. späte Bindung. –

3

Der Hauptunterschied liegt in der Art des Aufrufs von Objektmethoden. Im Falle des DispInterface-Aufrufs wird die IDispatch :: Invoke-Methode (in Skripten oder bei fehlender Schnittstellenbeschreibung) verwendet, siehe remarks. Diese Methode ist viel langsamer zweite Option. Im zweiten Fall direkt verwendet VTable für Methodenaufrufe (für Anrufe aus C + + oder. NET-Sprachen verwendet)

+0

So wird die Invoke-Methode für IDispatch zum Aufrufen von Methoden aus einem Skript wie VBScript oder JScript? –

+0

@Tony Korrekt: Wenn Sie möchten, dass das COM-Objekt aus einem Skript verwendet werden kann, benötigen Sie eine duale Schnittstelle. –

+1

Ja, wenn Sie im Skript eine Methode aufrufen, ruft es zuerst IDispatch :: GetIDsOfNames und dann IDispatch :: Invoke – Victor

1

Ich möchte nur auf Tony zusätzliche Fragen beantworten.

Wenn Sie eine COM erstellen möchten, auf die von VBScript/JScript oder von altem "klassischem" ASP zugegriffen werden kann, müssen Sie IDispatch implementieren.

In Visual Basic 6 oder in VBA von MS Office kann man beide Möglichkeiten verwenden. Wenn Sie Referenz zu Ihrer COM hinzufügen, werden Sie "früh gebunden" (IUnknown oder VTable) verwenden. Wenn Sie Ihre COM in VB6 oder VBA mit CreateObject ("ProgIdName") verwenden, werden Sie "spät gebunden" verwenden.

Es ist sehr wichtig zu verstehen, dass COM von VB6/VBA ect zugänglich zu machen. Es reicht nicht, nur die IUnknown-Schnittstelle zu implementieren. Sie müssen die Typbibliothek mit dem Attribut oleautomation erstellen und registrieren. Dazu können Sie in der Schnittstelle Ihres COM nur oleautomation kompatible Datentypen verwenden (siehe http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx). Für das Verständnis der Typ-Bibliothek spielen eine Rolle der Client-Marshalling-DLL, so dass es eine Client-Software wie VB6/VBA hilft, Daten korrekt als Parameter an Ihre COM zu senden. Sie sollten nicht vergessen, dass sogar Ihr COM ein InProc-Server ist, eine DLL, Parameter werden nicht direkt an COM weitergeleitet, sondern müssen gemarshallt werden. Während des Marshalling wird eine Kopie der Daten in dem Thread erstellt, in dem COM ausgeführt wird. Es macht Ihren COM-DLL-Thread von einer Seite sicher, und COM wird nicht abstürzen, wenn der Thread, der Ihre COM-Methode aufruft, beendet wird, bevor COM den Wert zurückgibt.

Wahrscheinlich ist meine Erklärung über Marshalling nicht einfach, aber es ist nur wichtig, nicht zu vergessen, die Typbibliothek zu erstellen und zu registrieren, die besser als Ressource in COM gespeichert werden soll.