【问题标题】:Delphi: How to make call to different procedures with its name string and parametersDelphi:如何使用名称字符串和参数调用不同的程序
【发布时间】: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 可以很容易地做到这一点。

标签: delphi pascal


【解决方案1】:

有不同的方法可以做到这一点。

最好的 IMO 之一是使用 Delphi 创建一个“自动化服务器”,将您的代码放在外部文件中。这是 Windows COM 功能的一部分。请参阅 Microsoft 网站上的 Automation ServersAutomation Clients自动化使您的应用程序可以操作在另一个应用程序中实现的对象,或公开对象以便对其进行操作。

一旦您的代码在自动化服务器中,它就会自动进行自动描述,即调用者 - 在另一个应用程序中 - 可以发现所有方法、它们的参数、返回值并调用它。

Delphi 不仅拥有创建自动化服务器和自动化客户端所需的东西,而且无需自己编写太多代码!

调用自动化服务器经常用于从 Delphi 程序调用 Office 应用程序。

编写自动化服务器可以做相反的事情:让 Microsoft Office 或任何能够使用自动化服务器(我刚才说 Delphi 可以轻松做到)的应用程序来调用自动化服务器中的方法。

很久以前我写过关于两者的博文:

那些博客文章使用 Microsoft Office 作为第二层,但当然您可以在客户端和服务器端使用 Delphi。

如果 DLL 已经编写好了,那么您可以将其封装在自动化服务器中以受益于这些功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多