Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ссылка на SafeArray в JScript (https://javascript.ru/forum/misc/15058-ssylka-na-safearray-v-jscript.html)

dolu 11.02.2011 14:57

ссылка на 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


Если кто-нибудь сталкивался с подобной проблемой, прошу подсказать путь к решению.

monolithed 11.02.2011 16:05

Цитата:

Сообщение от dolu
Вопрос: как это сделать?

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');
}

dolu 14.02.2011 09:34

Спасибо за ответ, но боюсь, что результат тот же: Type mismatch

result в данном случае будет объектом типа Array... но никак не SafeArray... :(

Напоминаю как выглядит структура SafeArray:
Код:

typedef struct tagSAFEARRAY
{
  USHORT cDims; // количество измерений массива
  USHORT fFeatures; // набор флагов, определяющих атрибуты массива
  USHORT cbElements; // размер элементов массива
  USHORT cLocks; // счетчик ссылок, указывающий количество блокировок, наложенных на массив
  USHORT handle; // не используется
  PVOID pvData; // указатель на данные массива
  SAFEARRAYBOUND rgsabound[1];
}  SAFEARRAY;

typedef struct tagSAFEARRAYBOUND
{
  ULONG cElements; // число элементов массива
  LONG lLbound;  // нижняя граница
} SAFEARRAYBOUND;

Так вот мне надо передать ссылку на экземпляр данной структуры.

dolu 16.02.2011 16:55

Пока нашел кривое решение:
написал промежуточную ActiveX dll, которая работает непосредственно с искомым COM сервером, получив SAFEARRAY она возвращает JScript-у массив в виде объекта CkData (http://www.chilkatsoft.com/refdoc/xCkDataRef.html).

Но это лишь временное решение... Существует необходимость работать с данным COM без посредников.


Часовой пояс GMT +3, время: 10:16.