在Delphi中如何实现动态函数调用
如:
unit test;interfaceuses sysutils;function Add(a, b : Integer): integer;
begin
  Result := a + b;
end;function Triple(a : Integer): Integer;
begin
  Result := 3 * a;
end;.............function DynamicRun(functionName : string; params : string; var outResult : string) : Boolean;
begin
???
end;要求不能在代码中采用静态方式连编代码,来动态调用上面的函数
若没有找到这样的函数,则提示相应信息

解决方案 »

  1.   

    你应该维护一张这样的表。
    -----------------------------------------------
    FuncName      | FuncPointer                    |
    -----------------------------------------------
    Add           | @Add                           |
    -----------------------------------------------
    Triple        | @Triple                        |
    -----------------------------------------------然后在你的DynamicRun函数根据入参DynamicRun,来找对应的函数,就ok了。
    具体的代码就不写了。
      

  2.   

    看看这个,用TMethod和TExec可以做到
    var
       Form1: TForm1;type
       TExec = procedure of object;procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;
    var
       Routine: TMethod;
       Exec: TExec;
    begin
       Routine.Data := Pointer(OnObject) ;
       Routine.Code := OnObject.MethodAddress(MethodName) ;
       if NOT Assigned(Routine.Code) then Exit;
       Exec := TExec(Routine) ;
       Exec;
    end;procedure TForm1.CallMeByName(Sender: TObject) ;
    begin
       ShowMessage('Hello Delphi!') ;
    end;procedure TForm1.Button1Click(Sender: TObject) ;
    begin
       ExecMethod(Form1, 'CallMeByName') ;
    end;
      

  3.   

    FigoZhu(谢慕安) ,这个方法还是要让编译器静态确定函数地址
    GARNETT2183的方法好一些,但是只能针对类的方法啊,不能针对普通函数吗?
      

  4.   

    FigoZhu(谢慕安) ( ) 信誉:98 
    -----------------------------
    完全同意,我们单位就是这样实现的。
      

  5.   

    TExec = procedure of object;
    还是让编译器知道了所要调用的函数/过程类型及参数信息
      

  6.   

    GARNETT2183方法我也用过,很好呀!
      

  7.   

    GetProcAddress可以利用函数名在模块中查找某个方法,这一点已经广泛的使用在dll的调用中了。
      

  8.   

    参考:http://quester.blog.sohu.com/1895284.html
      

  9.   

    xixuemao提供的参考需要玩汇编:(如果不想用GetProcAddress和dll,
    那就在DynamicRun里用if ....then...else if...枚举所有函数
    虽然不那么“高级”,但简单啊。
      

  10.   

    alaclp(陈石) ( ) 信誉:89    Blog 
      看样子这个问题又没有结果了,
      我的信誉分每次都是因为这样降低的!
    如果实在没有结果那也只能结贴,毕竟别人答你的问题没功也有劳,要不别人的100信誉或者更高是怎么保持的....把分分给用心答你问题的人,毕竟大家都不容易....
      

  11.   

    如果你会汇编 就 push  parameter1 
                    push  parameter2 
                    ...
                    call  function_addr
    注意一下入栈顺序就可以了
    如果你不会汇编 我很久没用delphi了,我忘了delphi是否有可变参数的函数申明 .
      

  12.   

    晕真是很久没用delphi了
    如果你想简单一点,那只用push 和call指令,这些动态调用的函数都使用标准的stdcall方式申明,你不但不用考虑寄存器,连清除站都免了.你不申明的话,delphi默认的方式还要通过寄存器传参数