Как вернуть массив строк из объекта ActiveX в JScript?
-
09-06-2019 - |
Вопрос
Мне нужно вызвать Win32 API, чтобы получить серию строк, и я хотел бы вернуть массив этих строк в JavaScript.Это сценарий, который запускается на локальном компьютере для сценариев администрирования, а не для веб-браузера.
Мой IDL-файл для COM-объекта имеет интерфейс, который я вызываю, как:
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);
Функция возвращает корректный результат, но строки «теряются», когда их присваивают переменной в JavaScript.
Вопрос в том:Как правильно вернуть массив строк в переменную JavaScript?
Решение
Если я правильно помню, вам нужно будет обернуть 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();
Другие советы
Шог9верно.Сценарии COM требуют, чтобы все выходные данные были ВАРИАНТАМИ.
Фактически, это также требует, чтобы все ВХОДЫ Также будьте ВАРИАНТЫ — см. неприятные подробности IDispatch в вашем любимом файле справки.Только благодаря волшебству реализации двойного интерфейса с помощью ATL и подобных уровней (которые, скорее всего, вы и используете), вам не о чем беспокоиться.Входные VARIANT, передаваемые вызывающим кодом, преобразуются в соответствии с сигнатурой вашего метода перед вызовом фактического метода.