Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2011, 14:57
Новичок на форуме
Отправить личное сообщение для dolu Посмотреть профиль Найти все сообщения от dolu
 
Регистрация: 11.02.2011
Сообщений: 3

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


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

Последний раз редактировалось dolu, 11.02.2011 в 15:18.
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2011, 16:05
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от 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');
}

Последний раз редактировалось monolithed, 12.02.2011 в 19:20.
Ответить с цитированием
  #3 (permalink)  
Старый 14.02.2011, 09:34
Новичок на форуме
Отправить личное сообщение для dolu Посмотреть профиль Найти все сообщения от dolu
 
Регистрация: 11.02.2011
Сообщений: 3

Спасибо за ответ, но боюсь, что результат тот же: 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, 14.02.2011 в 10:06.
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2011, 16:55
Новичок на форуме
Отправить личное сообщение для dolu Посмотреть профиль Найти все сообщения от dolu
 
Регистрация: 11.02.2011
Сообщений: 3

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

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

Последний раз редактировалось dolu, 16.02.2011 в 16:57.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая ссылка Wandererrr Общие вопросы Javascript 2 09.09.2010 01:13
ссылка и картинка Артем125 (X)HTML/CSS 8 01.08.2010 00:44
Подскажите по CSS меню Александр_1988 Элементы интерфейса 1 17.05.2010 11:58
Чудо-на Jscript Aphalin Ваши сайты и скрипты 10 07.10.2009 22:26
Jscript vs VBscript zzz Общие вопросы Javascript 18 17.08.2009 11:11