Delphi:如何使用名称字符串和参数调用不同的过程

问题描述

我必须调用一个类的许多DLL函数。 这是函数签名的示例:

builder.enableIntents(GatewayIntent.GUILD_MEMBERS);

我可以使用if-else或case来调用每个过程。但我想跳过一长串的if-else块。 在运行时,我的程序可以找到要调用的过程的名称。 因此可以通过传递其名称字符串和参数来调用所有函数。 像这样的样本:

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;

解决方法

有不同的方法。

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

一旦您的代码位于自动化服务器中,它就会自动进行自动描述,也就是说,调用方(在另一个应用程序中)可以发现所有方法,其参数,返回值并对其进行调用。

Delphi不仅具有创建自动化服务器和自动化客户端所需的功能,而且无需自己编写大量代码!

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

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

很久以前,我写了有关这两个博客的文章:

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

如果已经编写了DLL,则可以将其封装在自动化服务器中,以利用这些功能。