2014-07-23 73 views
-1

我有一個函數返回record的結果。我需要將它傳遞給另一種方法,如Pointer。它適用於32位模式,但在64位模式下會出現Invalid type cast錯誤。我該如何解決它?如何將記錄轉換爲Delphi上的64位平臺上的指針?

我試圖尋找已知的解決方案,但發現只有recordTObject轉換方法:Invalid typecast: convert record to tobject on 64-bit platform

aTList.Add(Pointer(aRecord)); // aRecord is a result of the function 
+0

你可以發佈的代碼工作,並導致編譯器錯誤的代碼? –

+1

它不能在32位模式下工作,您的記錄不是指針。你想要記錄的地址(@aRecord)。 –

+0

它適用於32位模式!這是流行的Toolbar2000組件的代碼。 – Dmitry

回答

5

如果aRecord是大小爲指針相同此代碼才能發揮作用。所以看起來aRecord是32位寬,因爲代碼是在32位上編譯的。

在32位和64位編譯器中工作的代碼最簡單的方法是首先將其轉換爲32位整數,然後轉換爲指針。像這樣:

Pointer(Cardinal(aRecord)) 

在相反的方向,你需要扭轉過程。首先投射到Cardinal的然後就到記錄:

TMyRecord(Cardinal(ptr)) 

FWIW,你在問題中提到了您鏈接的解決方案,以完美的工作。在實施層面,TObject變量不過是一個指針。

也許是時候開始使用通用列表,TList<TMyRecord>是你的朋友在這裏。

+0

它的工作原理和感謝關於通用列表的建議! – Dmitry

相關問題