我想通过
 
Invoke('TMyClass','MyFunc',MyVariantArray);
来调用一个类的方法,并能通过它返回结果,其中MyVariantArray是方法使用的参数

解决方案 »

  1.   

    procedure TForm1.Invoke(AClass: TClass; IntfInfo: PTypeInfo; MethName: string;
      params: Variant);
    var
      Inv: TInterfaceInvoker;
      Obj: TObject;
      InvContext: TInvContext;
      IntfMD: TIntfMetaData;
      MethNum: Integer;
      MD: TIntfMethEntry;
    begin
          MethNum := -1;
          GetIntfMetaData(IntfInfo, IntfMD, True);
          InvContext := TInvContext.Create;
            if MethName <> '' then
              MethNum := GetMethNum(IntfMD, MethName);
                MD := IntfMD.MDA[MethNum];
                InvContext.SetMethodInfo(MD);
                InvContext.AllocServerData(MD);            Obj := InvRegistry.GetInvokableObjectFromClass(AClass);
                  Inv := TInterfaceInvoker.Create;
                    Inv.Invoke(Obj, IntfMD, MethNum, InvContext);
    end;
    以上是一些从InvokeRegistry,OPToSOAPDomConv中截取的代码,但是向TInvContext中填入参数和取得返回值的代码,实在看不下去了,有点晦涩
      

  2.   

    应是可以有没有仔细研究过。要仔细研究一下 TypInfo 单元。顶。
      

  3.   

    typinfo里面没有解决方案,只有soap相关单元里提供了解决方案,简单说,
    如果你把自己的调用封装成一个soap规范的xml文档的化,是可以解决的,现在就是希望高手能把soap单元中的相关代码抽取出来,提供具有一般性的工具。
      

  4.   

    uses IntfInfo, TypInfo, Invoker这几个单元里,不知道有没有你要的东西
      

  5.   

    首先你得类是要一个实例,当然如果有字符串。你可以使用GetClass来获得类,创建实例后,然后再使用ARunTime.MethodAddress('FUNNAME'),剩下的就可以了吧。如下。
      TPLUGMETHOD = procedure(FunctionID: Integer; ExecData: Pointer) of object;
        ExecMethod: TMethod;    //加载需要加载的接口
        RunTimeClass:=GetClass(FInterFaceName);
        if not Assigned(RunTimeClass) then
          raise Exception.Create('无效的注册类:'+ InterFaceName);
        ARunTime:=RunTimeClass.Create;
        PExecMethodAddr:=ARunTime.MethodAddress('ExecFunction');
        if PExecMethodAddr = nil then
          raise Exception.Create('无效的接口方法');    ExecMethod.Data := ARunTime;
        ExecMethod.Code := PExecMethodAddr;
        //初始化接口
        TPLUGMETHOD(ExecMethod)(0, nil);
      

  6.   

    不是定义了TPLUGMETHOD 了吗,参数和返回值根据定义来。不可能没有规则的,随便调用。
      

  7.   

    xthmpro_cn([可人]) 
    我是想这样调用两个不同的方法
    invoke('myclass1','method1',vararrayof([1,'test']);
    同样我也可以
    invoke('myclass2','method2',vararrayof([2,'test',now,34.21]);
    可以有这样的一个invoke方法的实现吗?我可以接受都实现某个接口
      

  8.   

    我以前做了个Invoker系列的东西。留email
    支持stdcall,fastcall/register,cdecl,pascal
      

  9.   

    类似var Invoker:TInvoker;
    begin
     Invoker:=TRegisterInvoker.Create(@TForm1.xxx);
     Invoker.BindParams(['self','a','b','c','str']);
     Invoker.Invoke([Form1,1,2,3,"ff"]);
     ShowMessage(IntToStr(Invoker.GetReturn));
    end;
      

  10.   

    理论上说可以,但是你要确保所调用的函数的原型都被定义。如下:
    type
      TPLUGMETHOD1 = procedure(FunctionID: Integer; ExecData: Pointer) of object;
      TPLUGMETHOD2 = procedure(FunctionID: Integer; ExecData: Pointer; ExecData: Pointer) of object;
      

  11.   

    我那个对函数原形属于后期绑定,但对参数的绑定只是用于基于HTTP协议的远程方法调用(感觉SOAP太麻烦了,给自己封装了一套Delphi,JS,ASP,PHP的协议,可以传递对象)
    我那个可以不需要进行参数绑定。BindParams可要可不要,呵呵
      

  12.   

    [email protected]
    烦龙兄发来以瞻仰之
      

  13.   

    发了。只能当作分析原理来看。由于HttpInvoker涉及到我不方便公开的通讯协议,给删掉了
      

  14.   

    [email protected]
    烦龙兄发来以瞻仰之