【发布时间】:2020-10-07 06:40:03
【问题描述】:
我必须调用一个类的许多 DLL 函数。 这是函数签名的示例:
type
loaderClass = class
public
procedure proceA(x : Integer); virtual; stdcall; abstract;
procedure proceA1(x : Integer); virtual; stdcall; abstract;
procedure proceB(y : Integer; name : PAnsiChar); virtual; stdcall; abstract;
procedure proceB1(y : Integer; name : PAnsiChar); virtual; stdcall; abstract;
procedure proceC(z : Integer; name : string); virtual; stdcall; abstract;
procedure proceC1(z : Integer; name : string); virtual; stdcall; abstract;
procedure proceD(d : Double; c : Char); virtual; stdcall; abstract;
procedure proceD1(d : Double; c : Char); virtual; stdcall; abstract;
.....
.....
.....
end;
我可以使用 if-else 或 case 来调用每个过程。但我想跳过长长的 if-else 块列表。 在运行时,我的程序可以找到要调用的过程的名称。 那么是否可以通过传递其名称字符串和参数来调用所有函数。 像这样的示例:
//Variant parameters
args: array of const;
cArray : array of AnsiChar;
functionName: string;
loader := loaderClass.Create;
functionName := 'proceB';
args[0] := 10;
cArray := 'Hello';
args[1] := cArray;
//runtime it should call proceB(10, 'Hello');
loader.functionName(args[0], args[1]);
【问题讨论】:
-
不仅仅是按名称查找函数。您还需要动态参数传递。 RTTI 可以很容易地做到这一点。