2009-11-05 7 views
5

Fortsetzung von this question, bin ich verwirrt, ob DISPID_VALUE auf IDispatch::Invoke() für Skriptfunktionen und Eigenschaften (JavaScript in meinem Fall) kann als Standard und zuverlässig für den Aufruf der eigentlichen Funktion, die durch die IDispatch dargestellt wird?
Wenn ja, wird das irgendwo in MSDN erwähnt?ist DISPID_VALUE zuverlässig für den Aufruf von IDispatchs aus Skripten?

Bitte beachten Sie, dass die Frage ist, ob dieses Verhalten erwartet werden kann, nicht, was einige Schnittstellen, die ich nicht im Voraus wissen kann, aussehen könnte.

Ein einfacher wäre Anwendungsfall sein:

// usage in JavaScript 
myObject.attachEvent("TestEvent", function() { alert("rhubarb"); }); 

// handler in ActiveX, MyObject::attachEvent(), C++ 
incomingDispatch->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
         DISPATCH_METHOD, par, res, ex, err); 

edit: versucht, die Frage zu klären.

Antwort

3

Es sollte zuverlässig für Aufrufe von Objekten aus Skripten sein, wenn das Skript es konsistent definiert. Dies sollte für JScript/Javascript in MSHTML der Fall sein, aber leider gibt es wirklich spärliche Dokumentation zu diesem Thema, ich habe keinen soliden Beweis in der Hand.

In meiner eigenen Erfahrung sollte eine an attachEvent() übergebene Javascript-Funktion immer konsistent sein - ein empfangenes Objekt, das eine 'Funktion' ist, kann nur eine aufrufbare Methode haben, die sich selbst entspricht. Daher ist die Standardmethode die einzige, die Sie mit DISPID 0 finden können. Javascript-Funktionen haben normalerweise keine Mitgliedsfunktionen, obwohl ich mir sicher bin, dass es einen Weg dafür gibt. Wenn es Elementfunktionen hätte, würden Sie sie genauso sehen wie Elementfunktionen für Objekte. Elementfunktionen in JScript sind immer konsistent in Bezug auf IDispatchEx, entsprechend den Regeln von expando-Funktionen, da alle Funktionen, die zu einem Objekt hinzugefügt werden, als expandos gelten.

IDispatchEx interface @ MSDN

2

Die Standardmethode oder -eigenschaft, die DISPID_VALUE aufruft, sollte für eine bestimmte Schnittstelle konsistent sein. Diese Methode/Eigenschaft muss in der Definition der Schnittstelle in der IDL für die Typbibliothek als DISPID_VALUE angegeben werden. Die einzige Möglichkeit, dies zu ändern, ist, wenn der Besitzer der Schnittstelle eine neue Version der Schnittstelle freigegeben hat, die die Methode/Eigenschaft als Standard geändert hat, die jedoch gegen eine grundlegende Regel von COM-Schnittstellen verstoßen würde.

+0

Dass DISPID_VALUE im Allgemeinen konsistent sein sollte, hilft mir nicht - kann ich erwarten, dass es z. die eigentliche Funktion auf allen 'IDispatch's, die Skriptfunktionen darstellen? –

+0

Meiner Erfahrung nach, ja, solange sie Skriptobjekte direkt repräsentieren. Wie ich in meiner Antwort unten erwähnte, sind IDispatch-Objekte, die Sie über ConnectionPoints erhalten, ein wenig anders – taxilian

0

Sie können DISPID-Dateien DISPINTERFACE hinzufügen, aber Sie können sie nicht mehr ändern, sobald sie veröffentlicht wurden. Wenn Sie möchten, können Sie IDispatch::GetIDsOfNames verwenden, um Namen DISPIDs zuzuordnen.

Nehmen Sie eine Kopie von Inside Ole (2. Auflage) und Inside Ole 2 (2. Ausgabe) für ein paar Dollar auf Amazon verwendet. Es ist eine gute Referenz für diese obskuren OLE-Beschwörungen.

+0

Was 'GetIDsOfNames()' holt mich, wenn ich z. anonyme Funktionsobjekte, die an meine Kontrolle übergeben wurden? –

+0

Es gibt Ihnen das nicht. Sie müssen die Typinformationen aus einer Typbibliothek oder Dokumentation ermitteln –

1

Wie meklarian sagte DISPID_VALUE (0) ziemlich consistantly für JS-Funktionen zu funktionieren scheint (so funktioniert es gut mit einem benutzerdefinierten attachEvent). Ich benutze sie seit ungefähr einem Jahr, und es hat immer funktioniert. Ich habe auch mit einem ActiveX-Steuerelement mit einem eingebetteten Tag <object>, dass es konsequent zu arbeiten, muss ich IConnectionPointContainer und IConnectionPoint für die Haupt (Objekt-Tag) IDispatch implementieren CComObject, aber alle anderen, die ich Javascript als verfügbar machen, gefunden Rückgabewerte von Methoden oder Eigenschaften (über Invoke) Ich muss attachEvent und detachEvent selbst implementieren.

Wenn Verbindungspunkte verwenden, werden die IDispatch Objekte in Frage erwarten Ereignisse auf den gleichen DISPID gefeuert werden, wie sie auf Ihrem IDispatch Objekt angebracht sind ..

http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/JSAPI_IDispatchEx.h ein Beispiel für die Umsetzung der ConnectionPoints sehen.

Verwandte Themen