Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-83575
Oleg Fox
2003-05-14 12:22
2003.05.26
Изменение свойств компонента TEdit


1-83475
MainKaif
2003-05-15 11:47
2003.05.26
Отлов нажатия клавиши


3-83402
User_OKA
2003-05-03 11:33
2003.05.26
Locate


1-83604
Александр из Минска
2003-05-13 21:18
2003.05.26
Правка недочёта из FAQ (СКРОЛ МЫШИ)


14-83742
k2
2003-05-07 12:51
2003.05.26
Лечение наркомании





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский