Delphi 新版 System 單元引入 TPtrWrapper 記錄型別,解決 32/64 位指標與整數互轉的型別安全問題。傳統 Integer(P)、Pointer(Int) 在 64 位下會截斷,TPtrWrapper 提供型別安全的封裝,編譯器幾乎視同原生指標使用。
procedure TForm1.FormCreate(Sender: TObject);
var
num: Integer; p: Pointer; addr: NativeInt;
PW1, PW2, PW3: TPtrWrapper; b: Boolean;
begin
p := @num;
// 建構方式 1:從指標
PW1 := TPtrWrapper.Create(p);
addr := PW1.ToInteger; // 取得地址整數
// 建構方式 2:從地址整數
PW2 := TPtrWrapper.Create(addr);
PInteger(PW2.ToPointer)^ := 123; // 寫入數值
ShowMessage(IntToStr(num)); // 123
// 建構方式 3:空值
PW3 := TPtrWrapper.NilValue;
// 相等比較 (運算子多載)
b := PW1 = PW2; ShowMessage(BoolToStr(b, True)); // True
b := PW1 <> PW3; ShowMessage(BoolToStr(b, True)); // True
// 直接作為指標使用 (記錄第一欄位即指標)
p := Pointer(PW1);
ShowMessage(IntToStr(PInteger(p)^)); // 123
// 強制轉換
PW3 := TPtrWrapper(addr);
ShowMessage(IntToStr(Integer(PW3))); // 類似 1244823
end;
| 特性 | 說明 |
|---|---|
| Create(Pointer) | 從指標建構 |
| Create(NativeInt) | 從地址整數建構 |
| NilValue | 空指標單例 |
| ToInteger | 取得 NativeInt 地址 |
| ToPointer | 取得原始 Pointer |
| 運算子 = / <> | 指標值比較 |
| 隱含轉換 | 可直接賦值給 Pointer / NativeInt |
| 記錄結構 | 無額外開銷,第一欄位即原始指標 |
PtrUInt/PtrInt 等舊式型別,獲得編譯器檢查建議:新代碼全面採用 TPtrWrapper 取代裸指標整數轉換,提升 64 位相容性與程式碼可讀性。