powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
10 сообщений из 10, страница 1 из 1
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049821
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет!

в проекте, который мигрируется с Д7 на Д10.4.2 используются скрипты, написанные на VBScript. в Д7 использовался Dream Scripter, но на новую версию приходится
руками внедрять ActiveScript (т.к. проапгрейдить Dream Scripter нереально)

все бы ничего, но возникла проблема, суть которой мне пока не удается уловить.

вот такой вот код скрипта отрабатывается без каких-либо проблем:
-------------------
MsgBox TestCommand("какой-то текст")
-------------------

в данном случае под именем TestCommand зарегистрирован внешний (для скрипта) дельфовый объект, реализующий IDispatch и являющийся оберткой над обычной функцией

в тот момент, когда движок скрипта вызывает Invoke для IDispatch этого объекта (с именем TestCommand), в Params все просто - количество аргументов равно 1, по ссылке на первый по счету аргумент идут данные для значения типа bstr.

то есть все как бы в порядке.

но, если в этот вызов передать не константное значение,
а значение переменной, например вот так:
------------------
Dim TestParam

TestParam = "какой-то текст"

MsgBox TestCommand(TestParam)
------------------

то тогда при вызове Invoke количество аргументов по-прежнем равно 1, но вот
по ссылке на первый аргумент приходит какой-то левый мусор (с мусорным же
VarType'ом и т.д.), соответственно получить значение такого параметра совсем не выходит.

дальше, если переменную TestParam сделать не переменной, а константой типа такого:
------------------------
Const TestParam = "какой-то текст"

MsgBox TestCommand(TestParam)
--------------------------

то опять-таки все начинает нормально работать.


вобщем логика подсказывает конечно, что движок как-то по-другому наверное упаковывает
параметры в случае когда в них передаешь переменные. но беда в том, что сама по себе эта мысль не особо подсказывает куда дальше копать :-/


буду благодарен за любой раздуплинг по данной теме, куда копать, что смотреть и т.д.
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049827
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yoda
с мусорным же VarType'ом
Каким именно?
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049834
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049835
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$400C = varByRef or varVariant

Где мусор?
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049836
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, только сейчас дошло.

скорее всего это комбинация VT_ARRAY and VT_BYREF

так что надо теперь попробовать
разобрать соответствующие поля
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049837
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

сори, меня смутило то, как это значение интерпретировал
дельфовый TValue.
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049840
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из того, что я вижу
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure _VarCast(var Dest: TVarData; const Source: TVarData; AVarType: Integer);
begin
  if Source.VType = AVarType then
    _VarCopy(Dest, Source)
  else if Source.VType = varByRef or varVariant then
    _VarCast(Dest, PVarData(Source.VPointer)^, AVarType)
  else


вот так будет все работать само
Код: pascal
1.
2.
3.
4.
5.
var
  Str: WideString;
begin
  Str := Value;
end;
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049848
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мм, я сделал вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function ArgParam(Args: PVariantArgList; const Index: Integer): OleVariant;
var
  Arg: TVariantArg;
begin
  Arg := Args^[Index];

  if TVarData(Arg).VType = (VT_BYREF or VT_VARIANT) then
    Result := OleVariant(PVariant(Arg.byRef)^)
  else
    Result := OleVariant(Arg);
end;



копирование через _VarCopy в каком случае имеет смысл?
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40049851
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yoda
мм, я сделал вот так:
Вот так разве не работает?
Код: pascal
1.
2.
3.
4.
function ArgParam(Args: PVariantArgList; const Index: Integer): OleVariant;
begin
  Result := Args^[Index];
end;
...
Рейтинг: 0 / 0
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
    #40050065
Yoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

как я в изначальном посте написал, так не работает, если
в метод значение в скрипте передается в виде переменной
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]