Главная страница
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.012 c
14-83747
Fiend
2003-05-07 09:45
2003.05.26
Поздравляю с праздником.


14-83745
Lola
2003-04-25 16:04
2003.05.26
---|Ветка была без названия|---


14-83654
jazi
2003-05-07 08:45
2003.05.26
Самые дешевые цены по Москве!!!


11-83434
VaaL
2002-08-20 11:47
2003.05.26
Не компилится...


6-83620
трям
2003-03-26 01:12
2003.05.26
Как узнать в Вин IP адрес?