不知什麼時候 System 單元有了 TPtrWrapper 結構體, 它提供了非常小的一點功能: 指針(Pointer)與指針地址(NativeInt)的轉換. 很顯然, 以前常用的 Integer(P) 或 Ptr(Number) 已經不適用與 64 位了, 這時使用 TPtrWrapper 應該是更方便,更保險的選擇. 發現在 Delphi 新的源碼中, 幾乎就把 TPtrWrapper 當做指針來使用了.
{TPtrWrapper 全功能測試}procedure TForm1.FormCreate(Sender: TObject);
var
num: Integer;
p: Pointer;
Address: NativeInt;
PW1,PW2,PW3: TPtrWrapper;
b: Boolean;
begin
p := @num;
//建立方法 1
PW1 := TPtrWrapper.Create(p);
Address := PW1.ToInteger; //ToInteger
//建立方法 2
PW2 := TPtrWrapper.Create(Address);
PInteger(PW2.ToPointer)^ := 123; //ToPointer
ShowMessage(IntToStr(num)); //123
//建立方法 3
PW3 := TPtrWrapper.NilValue;
//Equal 運算
b := PW1 = PW2;
ShowMessage(BoolToStr(b, True));
//NotEqual 運算
b := PW1 <> PW3;
ShowMessage(BoolToStr(b, True));
//作為結構的 TPtrWrapper, 其起始位置存放的就是指針
p := Pointer(PW1);
ShowMessage(IntToStr(PInteger(p)^)); //123
//既如此, 也就可以直接把一個地址數, 或指針直接強制轉換為 TPtrWrapper 了
PW3 := TPtrWrapper(Address);
ShowMessage(IntToStr(Integer(PW3))); //類似於 1244823end;