Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用字符串指针通过windows消息发送字符串_String_Delphi_Pointers_Delphi 7 - Fatal编程技术网

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^;足够