我将我的程序添加到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
答案 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;