微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用字符串指针通过Windows消息发送字符串

我试图了解如何指向字符串工作.我有一个代码(不完全原创),这是由某人写的,而且这个人不在这里,所以我需要理解这种用法​​的想法.

var
  STR: string;
  pStr: ^string;
begin
  STR := 'Hello world';
  New(pStr);
  pStr^ := STR;

  PostMessage(Handle,WM_USER+1,wParam(pStr),0);
end;

现在我肯定知道,消息处理程序获取消息并且指针包含可以使用的字符串,但是在这些操作的“幕后”会发生什么?

我试着做一个小项目.我认为,将字符串分配给str指针指向的字符串实际上会增加原始字符串的refcount而不会创建字符串的任何副本,但refcount保持为1并且它似乎确实复制了内容.

所以得到问题,发生了什么?在指针上调用New会分配一个空字符串,对吧?
在赋值后,我试着查看一个字符串的引用/长度,指针指向这个PChar(@ pStr ^ [1])[ – 8],但它返回无意义(14),并且长度字节也是错误的.

另外问题是,使用指针以这种方式通过Windows消息传递字符串是否安全?

解决方法

New(pStr)在堆上分配一个字符串并返回指向它的指针.由于string是托管类型,因此字符串认初始化为空字符串.由于字符串是作为指针实现的,因此您从根本上拥有指向指针的指针.

只要您只将消息发布到您自己的进程,您的代码就完全没问题了.由于消息的有效负载是指针,因此它仅表示进程的虚拟地址空间的上下文中的某些内容.如果要发送到其他进程,则需要IPC机制.

显然,在将消息从队列中拉出的代码中,您需要处理该字符串.像这样的东西:

var
  p: ^string;
  str: string;
....
p := Pointer(wParam);
str := p^; 
dispose(p);

查询引用计数和长度的代码错误的.这是如何正确地做到这一点:

{$APPTYPE CONSOLE}

var
  pStr: ^string;
  p: PInteger;

begin
  New(pStr);
  pStr^ := 'Hello world';

  p := PInteger(pStr^);
  dec(p);
  Writeln(p^); // length
  dec(p);
  Writeln(p^); // ref count

  Readln;
end.

输出

11
1

原文地址:https://www.jb51.cc/windows/612859.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐