Wie gebe ich ein Array von Zeichenfolgen von einem ActiveX-Objekt an JScript zurück?

StackOverflow https://stackoverflow.com/questions/45169

  •  09-06-2019
  •  | 
  •  

Frage

Ich muss eine Win32-API aufrufen, um eine Reihe von Zeichenfolgen abzurufen, und ich möchte ein Array dieser Zeichenfolgen an JavaScript zurückgeben.Dies gilt für Skripte, die auf einem lokalen Computer für Verwaltungsskripte ausgeführt werden, nicht für den Webbrowser.

Meine IDL-Datei für das COM-Objekt hat die Schnittstelle, die ich aufrufe, als:

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

Die Funktion gibt korrekt zurück, aber die Zeichenfolgen gehen verloren, wenn sie einer Variablen in JavaScript zugewiesen werden.

Die Frage ist:Was ist der richtige Weg, um das String-Array an eine JavaScript-Variable zurückzugeben?­­­­­­­­­­­­­­­­­­­­­­­­

War es hilfreich?

Lösung

Wenn ich mich richtig erinnere, müssen Sie das einpacken SAFEARRAY in einem VARIANT damit es durchkommt, und verwenden Sie dann a VBArray-Objekt um es auf der JS-Seite zu entpacken:

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();

Andere Tipps

Shog9ist richtig.COM-Skripting erfordert, dass alle Ausgaben VARIANTEN sind.

Tatsächlich erfordert es auch, dass alle EINGÄNGE Seien Sie auch VARIANTEN – sehen Sie sich die unangenehmen Details von IDispatch in Ihrer bevorzugten Hilfedatei an.Es wird nur angenommen, dass Sie sich darüber keine Sorgen machen müssen, weil die Dual-Interface-Implementierung durch ATL und ähnliche Schichten (die Sie höchstwahrscheinlich verwenden) so magisch ist.Die vom aufrufenden Code übergebenen Eingabe-VARIANTs werden so konvertiert, dass sie mit Ihrer Methodensignatur übereinstimmen, bevor Ihre eigentliche Methode aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top