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.
Was genau meinen Sie mit 'binäre Spezifikation'? –
@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 –
+1 für frühe vs. späte Bindung. –