Как вернуть массив строк из объекта ActiveX в JScript?

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

  •  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, передаваемые вызывающим кодом, преобразуются в соответствии с сигнатурой вашего метода перед вызовом фактического метода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top