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

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

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

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

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

Вопрос в том: Как правильно вернуть массив строк в переменную JavaScript? Взаимодействие с другими людьми

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
4 237
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно помню, вам нужно обернуть 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();

Если оператор return ret.Detach () действительно будет> pvarBstrStringArray = ret.Detach (); Спасибо

markus 13.12.2008 03:16

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

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

Другие вопросы по теме