如何獲取過載的函數/過程/方法的所有地址位置?獲取過載方法的地址位置
例如,Dialogs.MessageDlgPosHelp有兩種不同的版本 - 一種沒有默認按鈕,另一種使用。我如何獲得這兩個功能的地址位置?
如何獲取過載的函數/過程/方法的所有地址位置?獲取過載方法的地址位置
例如,Dialogs.MessageDlgPosHelp有兩種不同的版本 - 一種沒有默認按鈕,另一種使用。我如何獲得這兩個功能的地址位置?
根據this thread
和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;
+1,這將完成這項工作 – Hendra
你也可以創建派生類,將暴露此重載方法具有不同的名稱的簡單方法,投的任何實例該類到新類並輕鬆使用包裝器方法的地址。
在這種情況下,重載的方法是'global'methonds –
當您說「全局方法」是指單位的過程或函數,而不是任何類或記錄的方法?對於這種情況,你可以添加自己的包裝程序或函數與自己的名字,只是在他們內部調用「全局方法」。沒有任何鑄造技巧。 – Nashev
是 - 「全局方法」是單元的功能/過程,而不是類/記錄。 由於這個項目已經接近五十年了,我想我是在一個解決方案後,將所有的(在這種情況下)MessageDlg方法重定向到一個自定義的方法,而不必觸摸代碼庫中的很多文件。最後,我們走了這條路,改變了我們找到的電話。 –
獲取重載類方法的地址在這裏討論[這裏](http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)。順便說一句,在我的Delphi 7中,MessageDlgPosHelp不會被重載,它只是一個正常的函數,而不是方法。術語「方法」是指一個類的功能或過程。 – Hendra
對於我來說,術語'方法'是指一個函數或過程,可能是一個類。我編輯了這個問題,以反映你的術語'方法'的含義。 –
我喜歡TLama的回覆(並已相應勾選)。我會更喜歡RTTI方式(正如Hendra的鏈接所建議的),它可以與Delphi的舊版本(沒有擴展RTTI)一起工作。 –