这是某种魔法......还是虫子?

时间:2015-10-13 23:43:57

标签: windows delphi

我将我的程序添加到SendTo。我发送了两个文件。 他们是:

C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg
C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\hello.jpg

以下代码显示C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg@C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg

procedure TForm1.FormCreate(Sender: TObject);
var Files: array of PAnsiChar;
    i: Integer;
begin
  SetLength(Files, 2);

  for i:=0 to 1 do begin
   Files[i] := PAnsiChar(ParamStr(2+i));
  end;

  ShowMessage( Files[0] +'@' + Files[1] );
end;

我在Windows7上使用Delphi 6。 在Delphi Xe3(仍然是Win7)下,我将PAnsiChar改为PWideChar,我也有同样的效果。

我的SendTo链接指向:

"C:\<PATH_HERE>\Project1.exe" c

并放在这里:

C:\Users\<USER>\AppData\Roaming\Microsoft\Windows\SendTo

1 个答案:

答案 0 :(得分:1)

使用字符串怎么样?例如:

procedure HandleParams;
var Files: array of string;
    i: Integer;
begin
  SetLength(Files, ParamCount);
  for i := 1 to ParamCount do
        Files[i-1] := ParamStr(i);

  if ParamCount >= 2 then
        ShowMessage( Files[0] +'@' + Files[1] );
end;

您的代码不起作用,因为PAnsiChar只是一个指针而不存储实际的字符串数据。当您分配从ParamStr函数返回的字符串时,只存储指向(临时)函数结果的指针。下一个函数调用将覆盖实际数据。这可能会在进一步使用时使程序崩溃。

顺便说一下,你的ParamStr索引迭代超过2和3,引用了第二个和第三个参数;也许这不是因为参数从索引1开始(索引0是程序调用本身)?

要解决问题,必须存储字符串数据,这使得指针有点无用,但无论如何,这里是您示例的固定版本:

procedure HandleParamsPAnsi;
var Files: array of PAnsiChar;
    FilesData: array of AnsiString;
    i: Integer;
begin
  SetLength(Files, 2);
  SetLength(FilesData, 2);

  for i:=0 to 1 do begin
      FilesData[i] := AnsiString(ParamStr(1+i));
      Files[i] := PAnsiChar(FilesData[i]);
  end;

  ShowMessage( Files[0] + '@' + Files[1] );
end;