Как вернуть массив строк из объекта ActiveX в JScript - PullRequest
5 голосов
/ 05 сентября 2008

Мне нужно вызвать Win32 API, чтобы получить серию строк, и я хотел бы вернуть массив этих строк в JavaScript. Это для сценария, который выполняется на локальном компьютере для сценариев администрирования, а не для веб-браузера.

Мой IDL-файл для COM-объекта имеет интерфейс, в который я вызываю:

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

Функция возвращает корректно, но строки теряются, когда они присваиваются переменной в JavaScript.

Вопрос в следующем: Как правильно получить массив строк, возвращаемых в переменную JavaScript?

Ответы [ 2 ]

6 голосов
/ 05 сентября 2008

Если я правильно помню, вам нужно обернуть SAFEARRAY в VARIANT, чтобы он прошел, а затем использовать VBArray object , чтобы распаковать его на стороне 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();
1 голос
/ 16 сентября 2008

Shog9 верно. Сценарий COM требует, чтобы все выходы были ВАРИАНТЫ.

На самом деле также требуется, чтобы все ВХОДЫ также были ВАРИАНТАМИ - см. Неприятные детали IDispatch в вашем любимом файле справки. Мы думаем, что магия реализации Dual Interface ATL и подобными уровнями (что, скорее всего, то, что вы используете) - вам не о чем беспокоиться. Входные VARIANT, переданные вызывающим кодом, преобразуются в соответствие с сигнатурой вашего метода перед вызовом фактического метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...