【问题标题】:How to invoke a VBscript function from pointer obtained by Getref in a Delphi COM server app如何从 Delphi COM 服务器应用程序中 Getref 获得的指针调用 VBscript 函数
【发布时间】:2020-08-22 16:23:14
【问题描述】:

我有一个 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 服务器具有 OleVariant 类型的 onActivate 属性。

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

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

我的问题是,在获得该值后,如何从存储在 Olevariant(调试器显示为 VarDispatch 类型)中的值调用 VBscript 函数?

【问题讨论】:

    标签: delphi vbscript delphi-10.3-rio


    【解决方案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;
    

    【讨论】:

    • 谢谢,但返回 DISP_E_BADVARTYPE,我认为它可能只是一个直接的函数地址而不是实际的 Idispatch,因为如果我使用 Idispatch(Fonactivate).GetTypeInfoCount(i) 它返回 0。
    • @Andyk 我更改了Param 的类型。可以再试一次吗?
    • 仍有 DISP_E_BADVARTYPE 结果。
    • @Andyk 我添加了缺少的Param 的初始化。希望这次能成功。
    • 成功了,非常感谢。一直在网上搜索如何在没有任何运气的情况下做到这一点。 Def 不明显。
    猜你喜欢
    • 2020-05-01
    • 2011-07-02
    • 2012-02-25
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多