2011-07-04 21 views
5

有沒有人知道Delphi如何表示對過程的引用?TProc和參考文件的內部(內存)表示

例如

var 
    proc: TProc; 
... 
proc = procedure begin beep end; 

什麼是我們在 「過程」 了?

我知道對於「方法變量」,內存表示是4個字節的「過程地址」,其次是4個字節的「對象地址」,但「參考過程」有些不同,我不能完全圖出來。

我想要這個的原因是因爲我有一些遺留代碼,我想使它與引用一起工作。

有人知道嗎?

+1

http://alex.ciobanu.org/?p=27 –

+2

一般而言,對procedure的引用保存在一個特殊的編譯器生成的接口變量中。這確保了它的引用計數,以便在沒有引用保留時可以清除捕獲的變量。你不需要知道它是如何實現的,以便使用''reference''。這就是爲什麼你有一個編譯器。 –

回答

10

方法引用是作爲COM風格的接口實現的,其方法名稱爲Invoke,與方法引用具有相同的簽名。

所以TProc看起來是這樣的:

type 
    TProc = interface(IInterface) // so inherits QI, AddRef, Release 
    procedure Invoke; 
    end; 

這是一個有效的問題要問,作爲德爾福與C++產品的互操作性。通過使用預先存在的引用計數類型和習語(COM生命週期規則),可以在方法參考級別與C++進行互操作。

匿名方法生成一個隱藏類,該類實現與方法引用接口同構的接口,即完全相同的形狀,但不具有相同的符號身份。隱藏類不直接實現方法引用接口,因爲它可能需要多次實現接口(一個塊可能包含多個匿名方法,這些方法全部分配給相同方法引用類型的位置)。

+0

很高興知道。謝謝你,巴里凱利。 – Nedko

+1

@巴里:一如既往的有趣!我不得不多次閱讀最後一段,但我想我明白了。恐怕這可能是一個愚蠢的問題,但是:括號內的部分是否意味着創建一個方法引用隱藏類的一個實例來實現多個匿名方法,其中幾個方法都在相同的正常過程中定義(或相同其他範圍)?這聽起來...複雜:) –

+2

@David匿名方法可能會捕獲局部變量;當你有幾個匿名方法都捕獲同一個變量時,他們需要共享狀態。 Delphi的實現將與塊中匿名方法關聯的所有狀態(即捕獲變量)放入同一個對象;每個匿名方法都變成了這個對象類的方法,而每個捕獲的變量都變成了一個字段。 –