8

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

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

4

2 回答 2

15

根据Thomas Muellerthis thread指出的内容,您可以定义具有相同签名的类型作为您想要获取其地址的方法(对于每个重载)。如果您随后声明这些类型的变量并将方法指针分配给它们,您将确保编译器为您已知的变量类型选择正确的重载,而且如果它们不会在代码中的任何地方使用,它也不会忽略它们(某些重载可能不会在您的二进制文件中链接)。

所以根据他的想法,它可能会寻找这样的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;
于 2012-06-25T05:14:23.253 回答
0

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

于 2017-03-15T11:15:45.717 回答