Windows 它';这是一种魔力。。。还是虫子?

Windows 它';这是一种魔力。。。还是虫子?,windows,delphi,Windows,Delphi,我将我的程序添加到SendTo。我向它发送了两个文件。 它们是: C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\hello.jpg 下面的代码显示了C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedTypeNisWhite\test。jpg@C:\ThisIs

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

C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg
C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\hello.jpg
下面的代码显示了
C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedTypeNisWhite\test。jpg@C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedTypenisWhite\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上使用Delphi6。 在DelphiXE3(仍然是Win7)下,我将(两个)PAnsiChar更改为PWideChar,并且我具有相同的效果

我的SendTo链接到:

"C:\<PATH_HERE>\Project1.exe" c
“C:\\Project1.exe”C
放在这里:

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

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

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;
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;
您的代码不起作用,因为PAnsiChar只是一个指针,不存储实际的字符串数据。分配ParamStr函数返回的字符串时,只存储指向(临时)函数结果的指针。实际数据将被下一个函数调用覆盖。当进一步使用时,这甚至会使程序崩溃

顺便说一下,ParamStr索引在2和3上迭代,并引用第二个和第三个参数;可能这不是因为参数是从索引1开始的(索引0是程序调用本身)

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

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;
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;

您可以通过使用
PChar
而不是
PAnsiChar
/
PWideChar
来添加更多的魔力,现在无论您是使用Delphi 6还是Delphi XE3进行编译,在编程时都没有魔力。这就是现在的问题所在——太多人认为软件背后有某种巫毒。请阅读。正如其他人已经注意到的那样,在这里使用PChars不是一个好主意。我只会使用
TStringList
。循环通过
ParamCount()
存储列表中的每个
ParamStr()
值,然后将其
分隔符
属性设置为
@
并读取其
分隔文本
属性。。。。您的ParamStr索引在2和3上迭代。。。可能您没有注意到SendTo链接中已经有一个参数,
c
,非常感谢。我不知道PChar只是指针,因为我可以做到:
var C:PChar;开始C:=‘你好,世界’和内存被分配。你帮我把事情弄清楚了。再次感谢!