2008-09-05 6 views
5

Ich muss in eine Win32-API aufrufen, um eine Reihe von Zeichenfolgen zu erhalten, und ich möchte ein Array dieser Zeichenfolgen an JavaScript zurückgeben. Dies ist für ein Skript, das auf dem lokalen Computer für Verwaltungsskripts und nicht für den Webbrowser ausgeführt wird.Wie gebe ich ein Array von Zeichenfolgen von einem ActiveX-Objekt an JScript zurück

Meine IDL-Datei für das COM-Objekt hat die Schnittstelle, die ich in so nenne:

 
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); 

Die Funktion gibt richtig, aber die Saiten immer ‚verloren‘, wenn sie eine Variablen zugewiesen werden in JavaScript.

Die Frage ist: Was ist der richtige Weg, um das Array von Strings an eine JavaScript-Variable zurückgegeben zu bekommen?

Antwort

6

Wenn ich mich richtig erinnere, müssen Sie die SAFEARRAY in einem VARIANT, um wickeln für sie, um durchzukommen und dann eine VBArray object verwenden Sie es auf der JS-Seite der Dinge auszupacken:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray) 
{ 
    // ... 

    _variant_t ret; 
    ret.vt = VT_ARRAY|VT_VARIANT; 
    ret.parray = rgBstrStringArray; 
    *pvarBstrStringArray = ret.Detach(); 
    return S_OK; 
} 

dann

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray(); 
+0

Sollte die Anweisung ret.Detach() eigentlich sein> pvarBstrStringArray = ret.Detach(); Danke – Mark

1

Shog9 ist richtig. COM-Scripting erfordert, dass alle Ausgaben VARIANTS sind.

In der Tat, es erfordert auch, dass alle INPUTs VARIANTS seine auch - die fiesen Details von IDispatch in Ihrer Lieblings-Hilfedatei. Es ist nur die Magie der Dual-Interface-Implementierung durch ATL und ähnliche Schichten gedacht (was höchstwahrscheinlich das ist, was Sie verwenden), dass Sie sich darüber keine Gedanken machen müssen. Die vom aufrufenden Code übergebenen Eingabe-VARIANTEN werden vor dem Aufruf Ihrer eigentlichen Methode so konvertiert, dass sie Ihrer Methodensignatur entsprechen.

Verwandte Themen