使用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'궳獧

最佳答案

我认为您的意思是copyData.cbdata := 1 * SizeOf(Char) + ...而不只是1 + ...

10-08 02:22