【发布时间】:2023-04-01 23:34:01
【问题描述】:
我需要构造一个字符串并通过PostMessage发送,即。
FileName := String_1 + String_2 + String_3;
PostMessage(FWndHandle, WM_BLA_BLA, NotifyData^.Action, LParam(FileName));
但有些东西不起作用。另外,FileName 是一个 PChar。代码如下所示:
var
FileName : PChar;
Directory_Str : String;
AnotherString : String;
begin
// Get memory for filename and fill it with data
GetMem(FileName, NotifyData^.FileNameLength + SizeOf(WideChar));
Move(NotifyData^.FileName, Pointer(FileName)^, NotifyData^.FileNameLength);
PWord(Cardinal(FileName) + NotifyData^.FileNameLength)^ := 0;
// TODO: Contact string before sending message
// FileName := AnotherString + Directory_Str + FileName;
PostMessage(FWndHandle, WM_BLA_BLA, NotifyData^.Action, LParam(FileName));
...
end;
现在我需要在调用PostMessage之前联系另一个字符串到变量FileName,即。
FileName := AnotherString + Directory_Str + FileName;
PostMessage(FWndHandle, WM_BLA_BLA, NotifyData^.Action, LParam(FileName));
如果 FileName 是一个字符串,这将起作用,但这里不是这种情况。
任何人都知道如何使用 PChar 做到这一点?我尝试了这些方法,有时可以,但最后总是会出现问题:
StrPCopy(FileName, FDirectory + String(FileName));
或
FileName := PChar(AnotherString + Directory_Str + FileName);
【问题讨论】:
-
“有些东西不工作”和“最后总是有些东西坏了”是什么意思?您遇到了什么具体问题?你为什么要使用
PChar和GetMem? (IOW,你为什么首先混合类型?) -
PostMessaging 字符串的一个问题是,当字符串在目标线程/窗口中接收之前超出范围时往往会被破坏 - PostMessage 只是传达指针,它对 refCount 一无所知在字符串上,因此不会增加它。
-
@MartinJames 这就是问题中的代码使用
GetMem分配缓冲区的原因。 -
@KenWhite:你说的很对,现在真的晚了,我只是快速输入问题而没有详细说明,但大卫明白了,它的解决方案运行良好!
标签: string delphi pointers delphi-2010