我该如何获取所有重载函数/过程/方法的地址位置?
例如,Dialogs.MessageDlgPosHelp有两个不同版本的重载函数 - 一个没有默认按钮,另一个有。我该如何获取这两个函数的地址位置?
我该如何获取所有重载函数/过程/方法的地址位置?
例如,Dialogs.MessageDlgPosHelp有两个不同版本的重载函数 - 一个没有默认按钮,另一个有。我该如何获取这两个函数的地址位置?
根据这篇帖子
和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;
此外,您还可以创建派生类,将重载方法公开为具有不同名称的简单方法,将该类的任何实例强制转换为新类,并轻松使用包装器方法的地址。