Windows 它';这是一种魔力。。。还是虫子?
我将我的程序添加到SendTo。我向它发送了两个文件。 它们是:Windows 它';这是一种魔力。。。还是虫子?,windows,delphi,Windows,Delphi,我将我的程序添加到SendTo。我向它发送了两个文件。 它们是: C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\test.jpg C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedMyPenIsWhite\hello.jpg 下面的代码显示了C:\ThisIsMySuperTestHelloWorld\ThisBookIsRedTypeNisWhite\test。jpg@C:\ThisIs
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:=‘你好,世界’代码>和内存被分配。你帮我把事情弄清楚了。再次感谢!