Мне нужно вызвать Win32 API, чтобы получить серию строк, и я хотел бы вернуть массив этих строк в JavaScript. Это для сценария, который запускается на локальном компьютере для сценариев администрирования, а не для веб-браузера.
Мой файл IDL для COM-объекта имеет интерфейс, который я вызываю как:
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);
Функция возвращается правильно, но строки теряются, когда они назначаются переменной в JavaScript.
Вопрос в том: Как правильно вернуть массив строк в переменную JavaScript? Взаимодействие с другими людьми



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если я правильно помню, вам нужно обернуть SAFEARRAY в VARIANT, чтобы он прошел, а затем использовать Объект VBArray, чтобы распаковать его на стороне JS:
HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
// ...
_variant_t ret;
ret.vt = VT_ARRAY|VT_VARIANT;
ret.parray = rgBstrStringArray;
*pvarBstrStringArray = ret.Detach();
return S_OK;
}
тогда
var jsFriendlyStrings = new VBArray( axOb.GetArrayOfStrings() ).toArray();
Shog9 верно. Сценарии COM требуют, чтобы все выходные данные были ВАРИАНТАМИ.
Фактически, это также требует, чтобы все ВХОДЫ также были ВАРИАНТАМИ - см. Неприятные подробности IDispatch в вашем любимом файле справки. Считается, что магия реализации двойного интерфейса с помощью ATL и аналогичных уровней (которые, скорее всего, именно то, что вы используете), позволяет вам не беспокоиться об этом. Входные VARIANT, переданные вызывающим кодом, преобразуются в соответствии с подписью вашего метода перед вызовом вашего фактического метода.
Если оператор return ret.Detach () действительно будет> pvarBstrStringArray = ret.Detach (); Спасибо