使用字符串指针通过Windows消息发送字符串
发布时间:2020-12-14 02:05:21 所属栏目:Windows 来源:网络整理
导读:我试图了解如何指向字符串工作.我有一个代码(不完全原创),这是由某人写的,而且这个人不在这里,所以我需要理解这种用法??的想法. var STR: string; pStr: ^string;begin STR := 'Hello world'; New(pStr); pStr^ := STR; PostMessage(Handle,WM_USER+1,wParam
我试图了解如何指向字符串工作.我有一个代码(不完全原创),这是由某人写的,而且这个人不在这里,所以我需要理解这种用法??的想法.
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会分配一个空字符串,对吧? 另外问题是,使用指针以这种方式通过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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows – 如何从命令promt title中删除’Administrator:
- wprintf输出可以在Windows上正确重定向到UTF-16?
- 唤醒用于Windows的Lan工具?
- 使用Kubernetes部署应用程序中的Windows SMB共享
- 在Windows python中安装Openalpr
- 在DLL中捕获C#中的SOAP
- LeetCode-239 Sliding Window Maximum
- 将uint8_t作为int8_t进行便携式重新解释并强制对其进行恭维
- Window10上安装Redis及其客户端
- active-directory – Windows 10:具有缺失权限的AD域管理员