gpt4 book ai didi

delphi - 带引号和不带引号的 WM_COPYDATA 会产生不同的结果

转载 作者:行者123 更新时间:2023-12-02 07:29:35 24 4
gpt4 key购买 nike

使用 WM_COPYDATA 将命令行参数传递到 Delphi XE 的另一个应用程序实例,如下所示:

function DAppInstance.SendParamsToPrevInstance(AWindowHandle: THandle): Boolean;
var
copyData: TCopyDataStruct;
cmdParams : string;
i : integer;
begin
cmdParams := '';
for i := 1 to ParamCount do
cmdParams := cmdParams + ParamStr(i); //#1
//cmdParams := cmdParams + '"' + ParamStr(i) + '" '; //#2
//cmdParams := cmdParams + format('"%s" ', [ParamStr(i)]); //#3
//cmdParams := cmdParams + format('%s;', [ParamStr(i)]); //#4

copyData.lpData := pchar(cmdParams);
copyData.cbData := 1 + (bytelength(cmdParams));
copyData.dwData := WaterMark; //ID for APP

result := SendMessage(AWindowHandle,
WM_COPYDATA,
Application.Handle,
LPARAM(@copyData)) = 1;
end;

如果字符串被引用/附加到,会产生不同的结果。

如果使用 #1 - 字符串是干净的,但如果不加引号则不可用,因为文件名可以包含空格,这样:

C:\Users\MX4399\Research\delphi\instance\doc with spaces.doc

最后将被视为 3 个参数,同时使用 #2 引用字符串,或附加任何内容 (#3, #4) 导致

"C:\Users\MX4399\Research\delphi\instance\doc with spaces.doc"'#$FF00'궳獧

最佳答案

我相信@TOndrej已经发现了问题的主要原因。然而,我认为你还有第二个更微妙的错误。

我认为,接收 WM_COPYDATA 消息的应用程序会将 lpData 视为以 null 结尾的字符串。如果数据格式错误,那么缓冲区就会溢出。我相信这正是您的示例中发生的情况,但事实证明它是良性的。 WM_COPYDATA 的编码仅复制 cbData 中指定的缓冲区大小。你必须确保你没有阅读超出它的内容。恶意应用程序可能会向您发送包含数据的 WM_COPYDATA 消息,迫使您执行此操作。相反,我建议您在阅读时使用 cbData

因此,要发送您编写的字符串:

copyData.lpData := PChar(cmdParams);
copyData.cbData := ByteLength(cmdParams))
copyData.dwData := WaterMark;

然后,当您收到它时,您会分配一个缓冲区并根据cbData的值复制到该缓冲区。

SetString(cmdParams, PChar(copyData.lpData), copyData.cbData div SizeOf(Char));

关于delphi - 带引号和不带引号的 WM_COPYDATA 会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com