Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript / 10 сообщений из 10, страница 1 из 1
02.03.2021, 13:57
    #40049821
Yoda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
всем привет!

в проекте, который мигрируется с Д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
02.03.2021, 14:13
    #40049827
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
Yoda
с мусорным же VarType'ом
Каким именно?
...
Рейтинг: 0 / 0
02.03.2021, 14:25
    #40049834
Yoda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
как-то так
...
Рейтинг: 0 / 0
02.03.2021, 14:28
    #40049835
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
$400C = varByRef or varVariant

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

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

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

сори, меня смутило то, как это значение интерпретировал
дельфовый TValue.
...
Рейтинг: 0 / 0
02.03.2021, 14:37
    #40049840
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
Из того, что я вижу
Код: 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
02.03.2021, 14:50
    #40049848
Yoda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с параметрами в IDispatch.Invoke при использовании ActiveScript/VBScript
мм, я сделал вот так:

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

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


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