String 使用字符串指针通过windows消息发送字符串
我试图理解字符串指针是如何工作的。我有一个代码(不完全是原创的),它是由某人编写的,这个人已经不在这里了,所以我需要理解这种用法的想法String 使用字符串指针通过windows消息发送字符串,string,delphi,pointers,delphi-7,String,Delphi,Pointers,Delphi 7,我试图理解字符串指针是如何工作的。我有一个代码(不完全是原创的),它是由某人编写的,这个人已经不在这里了,所以我需要理解这种用法的想法 var STR: string; pStr: ^string; begin STR := 'Hello world'; New(pStr); pStr^ := STR; PostMessage(Handle, WM_USER+1, wParam(pStr), 0); end; 现在我可以肯定地知道,消息处理程序获取消息,指针包含可以使
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
会分配一个空字符串,对吗?
赋值后,我试图查看指针指向的字符串的refcount/length,如下所示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
11
1.
这种数据传输是安全的。但也有风险,因为如果收件人没有收到您发布的邮件,或者如果收件人由于某种原因没有释放分配的内存,则会发生泄漏。使用WM_COPYDATA,您可以将任何数据发送给任何收件人,因为这是可以做到的。无需创建其他解决方案。@TLama,在什么情况下收件人不会收到邮件?@Marcus,如果收件人不存在或在邮件到达之前被销毁,例如,此技术不安全。你只需发布一条信息,让它飘浮,希望它能到达某个地方。如果不是,你就有漏洞了。备注:应该是str:=string(p^)代码>(^
已添加)@alz str:=p^;足够