ссылка на SafeArray в JScript
Привет!
Есть задача: передать методу COM-объекта ссылку на SafeArray в виде параметра. Этот метод запишет в искомый SafeArray некоторые данные. Код:
HRESULT STDMETHODCALLTYPE SomeMethod(LPSAFEARRAY* Buffer); Пробовал так: var dictionary = new ActiveXObject("Scripting.Dictionary"); for (var i = 0; i < 10; i++) { dictionary.add(i, 0); }; var ar1 = dictionary.items(); var ar2 = VBArray(ar1); var ar3 = VBArray(ar1).toArray(); var ar4; SomeObj.SomeMethod(ar1); SomeObj.SomeMethod(ar2); SomeObj.SomeMethod(ar3); SomeObj.SomeMethod(ar4); Все 4 варианта возвращают исключение: Type mismatch. WScript.echo(typeof ar1); // unknown WScript.echo(typeof ar2); // unknown WScript.echo(typeof ar3); // object WScript.echo(typeof ar4); // undefined Если кто-нибудь сталкивался с подобной проблемой, прошу подсказать путь к решению. |
Цитата:
var dictionary = new ActiveXObject("Scripting.Dictionary"), //WScript array = ['some1', 'some2', 'some3'], //items i = 10; //count while(i--) { if(array[i] != undefined) { dictionary.Add(i, array[i]); } } var j = dictionary.Count, result = []; while(j--) { if(dictionary.Exists(j)) { result.unshift((dictionary.Item(j))); } } WScript.echo(result); Чтобы посмотреть в IE: if (window.ActiveXObject) { var dictionary = new ActiveXObject("Scripting.Dictionary"), array = ['some1', 'some2', 'some3'], i = 10; while(i--) { if(array[i] != undefined) { dictionary.Add(i, array[i]); } } var j = dictionary.Count, result = []; while(j--) { if(dictionary.Exists(j)) { result.unshift((dictionary.Item(j))); } } alert(result.join(', ')); } else { alert('This browser does not support ActiveXObject'); } |
Спасибо за ответ, но боюсь, что результат тот же: Type mismatch
result в данном случае будет объектом типа Array... но никак не SafeArray... :( Напоминаю как выглядит структура SafeArray: Код:
typedef struct tagSAFEARRAY |
Пока нашел кривое решение:
написал промежуточную ActiveX dll, которая работает непосредственно с искомым COM сервером, получив SAFEARRAY она возвращает JScript-у массив в виде объекта CkData (http://www.chilkatsoft.com/refdoc/xCkDataRef.html). Но это лишь временное решение... Существует необходимость работать с данным COM без посредников. |
Часовой пояс GMT +3, время: 10:16. |