массив байт по маршруту .NET -> COM Interop -> JScript
От: Syd Россия  
Дата: 18.09.06 14:01
Оценка:
Уважаемые!

Знаю, что тема передачи массива байт из .NET сборки в код на JScript поднималась и обсуждалась тут неоднократно, но тем не менее, решения найденные мной посты не дали.

Собственно задача проста. Есть тип .NET, один из методов которого возвращает массив байт

[ComVisible(true)]
public byte[] SomeMethod(string param)
{
   byte[] bytes;
   ...
   
   return bytes;
}


При регистрации сборки с этим типом для COM Interop имеем следующий IDL для библиотеки типов:

interface _Test : IDispatch {
    ...        
    HRESULT SomeMethod(   [in] BSTR param, 
                        [out, retval] SAFEARRAY(unsigned char)* pRetVal);
    };



Теперь пытаемся вызвать метод из JScript:


<script language="javascript">
var test = new ActiveXObject("Test");
var res = test.SomeMethod("test"));


Получаем, что res не null и не undefined, но typeof(res) выдает unknown. Конструкция var vbar = new VBArray(res) выдает ошибку.

Че делать-то?
I'm just talking about having fun
Re: массив байт по маршруту .NET -> COM Interop -> JScript
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.09.06 05:49
Оценка: 4 (1)
Здравствуйте, Syd, Вы писали:

Syd>Знаю, что тема передачи массива байт из .NET сборки в код на JScript поднималась и обсуждалась тут неоднократно, но тем не менее, решения найденные мной посты не дали.


Нет массива байт для скриптов. Ни для каких. Есть массив вариантов. Вот как хочешь, так и выкручивайся. Либо передавай этот массив байт далее по цепочке обработки.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: Syd Россия  
Дата: 19.09.06 07:51
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Syd, Вы писали:


Syd>>Знаю, что тема передачи массива байт из .NET сборки в код на JScript поднималась и обсуждалась тут неоднократно, но тем не менее, решения найденные мной посты не дали.


Vi2>Нет массива байт для скриптов. Ни для каких. Есть массив вариантов. Вот как хочешь, так и выкручивайся. Либо передавай этот массив байт далее по цепочке обработки.


Это, в принципе, ясно. Я просто не совсем пойму: COM (через CCW) вроде как возвращает Safearray, которым можно в JScript инициализировать объект VBArray, чтобы уже из него вытащить объект Array. Только вот что-то не выходит...
I'm just talking about having fun
Re[3]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.09.06 09:55
Оценка: 2 (1) +1
Здравствуйте, Syd, Вы писали:

Syd>Это, в принципе, ясно. Я просто не совсем пойму: COM (через CCW) вроде как возвращает Safearray, которым можно в JScript инициализировать объект VBArray, чтобы уже из него вытащить объект Array. Только вот что-то не выходит...


Снова придется повторить: "Нет массива байт для скриптов. Ни для каких. Есть массив вариантов." И нет массива строк, нет массива целых чисел. Есть только массив вариантов, которые, в свою очередь, могут содержать и байты, и строки, и числа и т.п. Я не знаю, как это должно выглядеть на .NET, но, наверное, public Object[] SomeMethod(string param).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: Left2 Украина  
Дата: 19.09.06 09:59
Оценка: 2 (1)
Syd>Это, в принципе, ясно. Я просто не совсем пойму: COM (через CCW) вроде как возвращает Safearray, которым можно в JScript инициализировать объект VBArray, чтобы уже из него вытащить объект Array. Только вот что-то не выходит...
Чтобы JS смог увидеть как VBArray Safearray, ему нужно передать Savearray(VARIANT). ни с каким другим (SafeArray(char), SafeArray(long)) он работать не будет. Кстати, Visual Basic в этом отношении ведёт себя точно так же.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: Syd Россия  
Дата: 19.09.06 11:02
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Syd, Вы писали:


Syd>>Это, в принципе, ясно. Я просто не совсем пойму: COM (через CCW) вроде как возвращает Safearray, которым можно в JScript инициализировать объект VBArray, чтобы уже из него вытащить объект Array. Только вот что-то не выходит...


Vi2>Снова придется повторить: "Нет массива байт для скриптов. Ни для каких. Есть массив вариантов." И нет массива строк, нет массива целых чисел. Есть только массив вариантов, которые, в свою очередь, могут содержать и байты, и строки, и числа и т.п. Я не знаю, как это должно выглядеть на .NET, но, наверное, public Object[] SomeMethod(string param).


Да, с возвращением Object[] все работает, а вот если нужно возвращать byte[]? Сборка используется как в скриптовом, так и в .NET окружении.
Заранее прошу прощения за "невежественность", но срок знакомства с миром .NET — 3 недели.
I'm just talking about having fun
Re[5]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: George Seryakov Россия  
Дата: 19.09.06 13:50
Оценка: 2 (1)
Здравствуйте, Syd, Вы писали:

Syd>Да, с возвращением Object[] все работает, а вот если нужно возвращать byte[]?


В скрипте — никак. Никак. НИКАК.

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

Еще можно попробовать дополнительный обработчик (компонент), который бы массив байтов транслировал бы в массив вариантов. Либо сразу в JSArray. Типа вот так:

var res = test.SomeMethod("test"));
var tranlator = new ActiveXObject(<ProgId here>);
var array_of_variants = tranlator.ToArayOfVariants(res);
var jsarray1 = new VBArray(array_of_variants);
var jsarray2 = tranlator.ToJSAray(res);
GS
Re[6]: массив байт по маршруту .NET -> COM Interop -> JScrip
От: Syd Россия  
Дата: 19.09.06 14:23
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, Syd, Вы писали:


Syd>>Да, с возвращением Object[] все работает, а вот если нужно возвращать byte[]?


GS>В скрипте — никак. Никак. НИКАК.


GS>Добавь еще и метод который возвращает варианты, если нужно и массив байтов и в скрипте.


Так уже и сделал.

GS>Еще можно попробовать дополнительный обработчик (компонент), который бы массив байтов транслировал бы в массив вариантов. Либо сразу в JSArray. Типа вот так:


GS>
GS>var res = test.SomeMethod("test"));
GS>var tranlator = new ActiveXObject(<ProgId here>);
GS>var array_of_variants = tranlator.ToArayOfVariants(res);
GS>var jsarray1 = new VBArray(array_of_variants);
GS>var jsarray2 = tranlator.ToJSAray(res);
GS>


Большой необходимости в этом варианте нет.
В общем, все спасибо, проблема решена, а главное, понята.
I'm just talking about having fun
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.