获取重载方法的地址位置

8

我该如何获取所有重载函数/过程/方法的地址位置?

例如,Dialogs.MessageDlgPosHelp有两个不同版本的重载函数 - 一个没有默认按钮,另一个有。我该如何获取这两个函数的地址位置?


在这里讨论了获取重载类方法地址的问题(https://dev59.com/e2LVa4cB1Zd3GeqPw4LD)。顺便提一下,在我的Delphi 7中,MessageDlgPosHelp没有被重载,它只是一个普通函数,不是方法。术语“方法”指的是类的函数或过程。 - Hendra
1
对我来说,“方法”这个术语意味着一个函数或过程,可能是一个类的一部分。我已经修改了问题以反映您对“方法”的含义。 - Nicholas Ring
1
我喜欢TLama的回复(并已相应地打勾)。我更喜欢类似RTTI方式的东西(如Hendra链接所建议的),这可以与旧版本的Delphi一起使用(这些版本没有扩展的RTTI)。 - Nicholas Ring
@Nicholas,你是指较新版本的Delphi吗? - Hendra
我有Embarcadero的特殊版本 - Delphi 7、2007、2009、2010、XE和XE2。首选Delphi 7、XE(因为我在工作中使用它)和XE2。 - Nicholas Ring
2个回答

15

根据这篇帖子Thomas Mueller在那里提到的内容,您可以定义与要获取其地址的方法相同签名的类型(对于每个重载)。然后,如果您声明这些类型的变量并将方法指针分配给它们,您将确保编译器选择适合您已知变量类型的正确重载,并且还将不会忽略它们,即使它们在代码中没有使用(某些重载可能不会链接到您的二进制文件中)。

因此,基于他的想法,它可能会像这样查找MessageDlgPosHelp函数的重载:

type
  TMessageDlgPosHelp1 = function(const Msg: string; DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
    const HelpFileName: string): Integer;
  TMessageDlgPosHelp2 = function(const Msg: string; DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
    const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  MessageDlgPosHelp1: TMessageDlgPosHelp1;
  MessageDlgPosHelp2: TMessageDlgPosHelp2;
begin
  MessageDlgPosHelp1 := MessageDlgPosHelp;
  MessageDlgPosHelp2 := MessageDlgPosHelp;
  ShowMessage(Format('%p; %p', [@MessageDlgPosHelp1, @MessageDlgPosHelp2]));
end;

0

此外,您还可以创建派生类,将重载方法公开为具有不同名称的简单方法,将该类的任何实例强制转换为新类,并轻松使用包装器方法的地址。


在这种情况下,重载的方法是“全局”方法。 - Nicholas Ring
当您说“全局方法”时,是指单元的过程或函数,而不是任何类或记录的方法吗?对于这种情况,您可以添加自己的包装程序或函数,并使用自己的名称调用其中的“全局方法”。无需进行任何转换技巧。 - Nashev
是的 - “全局方法”是一个单元的函数/过程,而不是类/记录。 由于这个项目已经接近五年了,我认为我当时正在寻找一种解决方案,可以将所有(在这种情况下)MessageDlg方法重定向到自定义方法,而无需触及代码库中的许多文件。最终,我们采取了这种方式,随着我们发现它们,改变调用方式。 - Nicholas Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接