获得过载方法的地址位置(Obtaining address locations of an over

2019-06-25 17:39发布

我如何获得一个重载的功能/程序/方法的所有地址位置?

例如,Dialogs.MessageDlgPosHelp超载具有它的两个不同版本 - 一个没有默认按钮和一个用。 我怎么会得到两个函数的地址位置?

Answer 1:

基于this 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;


Answer 2:

你也可以创建派生类为具有不同名称的简单方法,强制转换类的任何实例,以新的类,将暴露这个重载的方法和容易使用你的包装方法的地址。



文章来源: Obtaining address locations of an overload method