Как вызвать функцию VBscript из указателя, полученного Getref в приложении COM-сервера Delphi

У меня есть приложение для COM-сервера, и мне нужно связать обратные вызовы с конкретными событиями, которые связаны с задержкой.

Мой тестовый сценарий VB выглядит следующим образом

Sub Main
  dim Frm
  Set Frm=NewForm("Form1")
  Frm.OnActivate = getRef("Frm_OnActivate")
  a= Frm.Showmodal
end Sub

sub Frm_OnActivate
  MsgBox("Activate")
end Sub

Мой com-сервер имеет свойство onActivate типа OleVariant.

function TALform.Get_OnActivate: OleVariant;
begin
  result:=FonActivate;
end;

procedure TALform.Set_OnActivate(Value: OleVariant);
begin
  FonActivate:=Value;
  Fform.OnActivate:=OnactivateEx
end;

Мой вопрос: получив это значение, как мне вызвать функцию VBscript из значения, хранящегося в Olevariant (которое отладчик показывает как тип VarDispatch)?


person Andy k    schedule 07.05.2020    source источник


Ответы (1)


Попробуйте что-то вроде этого:

var
    Param: TDispParams;
    MethodResult: OleVariant;
    Result: HRESULT;
begin
    Param.rgvarg := nil;
    Param.rgdispidNamedArgs := nil;
    Param.cArgs := 0;
    Param.cNamedArgs := 0;
    Result := IDispatch(FonActivate).Invoke(0, GUID_NULL, SysLocale.DefaultLCID, DISPATCH_METHOD, Param, @MethodResult, nil, nil);
end;
person Olivier    schedule 07.05.2020
comment
Спасибо за это, но возвращает DISP_E_BADVARTYPE, я думаю, это может быть просто адрес прямой функции, а не фактический Idispatch, потому что, если я использую Idispatch (Fonactivate) .GetTypeInfoCount (i), он возвращает 0. - person Andy k; 07.05.2020
comment
@Andyk Я поменял тип Param. Вы можете попробовать еще раз? - person Olivier; 07.05.2020
comment
по-прежнему имеет результат DISP_E_BADVARTYPE. - person Andy k; 07.05.2020
comment
@Andyk Я добавил недостающую инициализацию Param. Надеюсь, на этот раз это сработает. - person Olivier; 07.05.2020
comment
Это помогло, большое вам спасибо. Искал по всей сети, как это сделать, но безуспешно. Деф не очевиден. - person Andy k; 07.05.2020