Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Вниз
Передача параметров из 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c