Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Передача параметров из Microsoft ScriptControl   Найти похожие ветки 

 
EugeneL ©   (2003-05-15 12:14) [0]

Стоит следующая задача: вызвать Microsoft ScriptControl, передав в него в общем случае несколько параметров различных типов (в том числе массивов), текст на VBScript, обрабатывающий эти параметры и возвращающий результат своей работы также в виде нескольких параметров.

Простейший пример такого текста на VBScript (передаём 2 массива, размерности известны, возвращаем массив - их сумму).

Function F(in0, in1, ByRef out0)
for i = 0 to 2
out0(i) = in0(i) + in1(i)
next
End Function

Теперь описываем код для вызова ScriptControl-a из Delphi (Memo1 - memo, содержащий код на VBScript):

var
Params : PSafeArray;
v: Variant;
begin
v := VarArrayCreate([0, 2], varVariant);
v[0]:=VarArrayOf([10, 20, 30]);
v[1]:=VarArrayOf([15, 25, 35]);
v[2]:=VarArrayOf([1, 2, 3]);

Params := PSafeArray(TVarData(v).VArray);

ScriptControl1.SitehWnd := Self.Handle;
ScriptControl1.Language := "VBScript";
ScriptControl1.AddCode(Memo1.Lines.Text);
ScriptControl1.Run("F", Params);

ShowMessage(v[2][1]);
end;

Проблема в том, что в выходном параметре out0 после завершения метода Run не возвращаются необходимые значения (остаются те, которые мы указали при инициализации). Код VBScript работает нормально, по завершении функции в out0 правильные значения, но вот обратно в Delphi эти значения не возвращаются.

Как избежать этой проблемы?


 
nikkie ©   (2003-05-15 14:34) [1]

VBScript просто-напросто игнорирует ключевое слово ByRef. Будут ли изменены параметры - определяется тем, кто вызывает, а не самой процедурой. Внутри самого скрипта это определяется тем, как написан вызов (насколько мне помнится - стоят скобки вокруг параметров или нет).

Чтобы параметр получил новые значения при вызове процедуры из хоста, его надо передавать как VT_BYREF|VT_VARIANT. Попробуй упаковать свой PSafeArray в еще один Variant.


 
Polevi ©   (2003-05-15 15:50) [2]

имхо проще описать прокси-класс, реазизующий IDispath и его экземпляр передавать в скрипт
входные и выходные параметры задекларировать в виде published свойств


 
nikkie ©   (2003-05-15 18:23) [3]

>Polevi
Если стоит задача скриптом менять какие-то параметры программы, то можно и через AddNamedItem. Только вряд ли это будет проще. Потом может быть ситуация, когда нужно, чтобы именно метод менял параметр.

>published свойств
это ты конечно сказанул ;)



Страницы: 1 вся ветка

Текущий архив: 2003.05.26;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.02 c
14-83741
Renegate
2003-05-07 14:35
2003.05.26
Epson 680.


6-83639
ИЭ-01
2003-02-07 12:03
2003.05.26
Как передать звук по сети в реальном времени?


3-83340
diokant
2003-05-05 15:35
2003.05.26
Подскажите по MS SQL 2000, почему так нельзя...


14-83683
Dmitriy_R
2003-05-06 07:08
2003.05.26
ServerSocket


1-83461
vidiv
2003-05-05 09:42
2003.05.26
Как получить ContactList и History у ICQ 2002-2003?