随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


不知什么时候 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))); //类似于 1244823
end;

posted on   万一  阅读(1742)  评论(3编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2008-06-10 再学 GDI+[18]: FillEllipse、TGPHatchBrush(阴影画刷)
2008-06-10 再学 GDI+[17]: FillRectangle、ColorRefToARGB、TGPSolidBrush 和颜色透明度
2008-06-10 再学 GDI+[16]: GDI+ 的颜色常量表
2008-06-10 再学 GDI+[15]: GDIPAPI 单元提供的 Make 及 Color 系列函数
2008-06-10 再学 GDI+[14]: DrawBeziers - 绘制一组贝塞尔线
2008-06-10 再学 GDI+[13]: DrawBezier - 绘制贝塞尔线
2008-06-10 再学 GDI+[12]: 准备工作 - 矩形命中


点击右上角即可分享
微信分享提示