Главная страница
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
7-83754
KPV-10k
2003-03-25 21:14
2003.05.26
Как выдвинуть лоток конкретного CD-ROM a без помощи TMediaPlayer


4-83785
QUE
2003-03-24 13:25
2003.05.26
System Tray Icon Иконка сваливается при наведении мышкой


14-83696
oss
2003-05-06 13:56
2003.05.26
документация


1-83531
lovres
2003-05-13 11:43
2003.05.26
Вопрос про QReport


6-83645
dir_er
2003-03-24 03:25
2003.05.26
dialup