Дилемма отправки байтового массива из JavaScript в COM - PullRequest
1 голос
/ 14 марта 2010

У меня небольшая проблема, потому что ни Javascript, ни ActiveX (написанные на C ++) не ведут себя как хорошие маленькие дети. Все, что я прошу их сделать, - это чтобы Javascript отправлял байтовый массив и чтобы ActiveX правильно получал байтовый массив для выполнения большего количества вычислений.

Вот так я объявил свой байтовый массив в JS и проверил его внутри JS:

var arr = new Array(0x00, 0xA4, 0x04, 0x00, 0x10,0xA0, 0x00, 00, 00, 0x18, 0x30, 0x03, 0x01, 00, 00, 00, 00, 00, 00, 00, 00);

Javascript отправляет этот массив в качестве аргумента методу ActiveX. Вот сложная часть; Я хочу, чтобы метод ActiveX получал байтовый массив как SAFEARRAY или VARIANT, но я не могу заставить его работать на всю жизнь.

Я попытался отладить и увидеть содержимое, полученное внутри ActiveX, как SAFEARRAY или VARIANT, но безрезультатно. Вот сегмент IDL:

[id(7), helpstring("blah blah blah")]  HRESULT  Blah( [in] VARIANT blah1, [out, retval]VARIANT* blah2);

Любая помощь очень ценится. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2010

Массивы в JScript не являются отдельными типами, это просто объекты, которые имеют свойство length и предоставляют доступ к их содержимому через свойства.
В вашем методе Invoke() / InvokeEx() полученный аргумент VARIANT должен содержать IDispatch, представляющий объект сценариев. После этого получите свойство length и получите содержимое через имена свойств от 0 до length-1.

В качестве примера реализации см., Например, FireBreaths IDispatchAPI::GetProperty() (IDispatchAPI оборачивает туда объект браузера с поддержкой скриптов). dispApi->GetProperty("length") получит размер массива, а dispApi->GetProperty("0") - length-1 - фактическое содержимое массива.

1 голос
/ 14 марта 2010

Я боролся с этим в проекте 5 лет назад. В итоге мы обменивались строками между JavaScript и COM, потому что они имеют низкие накладные расходы и могут быть легко заменены. Если данные действительно двоичные, вам придется их кодировать. Мы использовали base64, но вы также можете добавить 0x100 ко всем значениям байтов, потому что строки в любом случае имеют юникод (16-битный символ) с любой стороны.

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