Главная страница
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.013 c
1-83582
tv
2003-05-14 13:06
2003.05.26
Работа с изображениями в потоке


3-83407
gary5555
2003-05-06 18:00
2003.05.26
Нумерация строк с помощью RecNo.


11-83432
Gandalf
2002-08-19 10:34
2003.05.26
Result:=(KOL) or (KOL and MCK);


6-83632
pheonix
2003-03-28 15:33
2003.05.26
TIdFTP


3-83330
diww
2003-05-05 12:53
2003.05.26
переиндексация dbf