在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;要求不能在代码中采用静态方式连编代码,来动态调用上面的函数
若没有找到这样的函数,则提示相应信息
如:
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;要求不能在代码中采用静态方式连编代码,来动态调用上面的函数
若没有找到这样的函数,则提示相应信息
解决方案 »
- 如何在console程序中显现timer的功能。
- delphi执行存储过程出
- 100分再次求救一个dxDBTreeBom三方控件
- 请问,能否用DBGRIDEH做出如下表格来?
- 请问每个窗体都能用的全局变量该设在哪里?怎么设?
- **请问Kylix3在红帽7上如何安装?
- 在DBGrid中如何获取当前选中单元格的位置??? 解决了马上给分。。。
- 帮助我测试,谢谢啦
- 如何复制字符串?
- bmp转化成jpg的问题
- Delphi中使用VB做的ActiveX控件时键盘的四个箭头键丢失了.
- 如何通过delphi显示tif或tiff格式的图象,并把tif格式的图象数据导入到数据库中,再从数据库中把tif数据导到image控件中显示
-----------------------------------------------
FuncName | FuncPointer |
-----------------------------------------------
Add | @Add |
-----------------------------------------------
Triple | @Triple |
-----------------------------------------------然后在你的DynamicRun函数根据入参DynamicRun,来找对应的函数,就ok了。
具体的代码就不写了。
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;
GARNETT2183的方法好一些,但是只能针对类的方法啊,不能针对普通函数吗?
-----------------------------
完全同意,我们单位就是这样实现的。
还是让编译器知道了所要调用的函数/过程类型及参数信息
那就在DynamicRun里用if ....then...else if...枚举所有函数
虽然不那么“高级”,但简单啊。
看样子这个问题又没有结果了,
我的信誉分每次都是因为这样降低的!
如果实在没有结果那也只能结贴,毕竟别人答你的问题没功也有劳,要不别人的100信誉或者更高是怎么保持的....把分分给用心答你问题的人,毕竟大家都不容易....
push parameter2
...
call function_addr
注意一下入栈顺序就可以了
如果你不会汇编 我很久没用delphi了,我忘了delphi是否有可变参数的函数申明 .
如果你想简单一点,那只用push 和call指令,这些动态调用的函数都使用标准的stdcall方式申明,你不但不用考虑寄存器,连清除站都免了.你不申明的话,delphi默认的方式还要通过寄存器传参数