Windows快捷方式是否支持很长的参数长度?

时间:2011-02-11 14:22:17

标签: windows delphi delphi-2007 shortcut maxlength

我正在尝试创建一个包含长参数字符串(> MAX_PATH)的快捷方式(在桌面上)。

MSDN documentation明确指出,对于Unicode字符串,字符串可以长于MAX_PATH。

生成的快捷方式在MAX_PATH字符(即Path + Arguments)之后完全切断。

我的实现是否有问题,或者这是一些Windows限制?

procedure CreateShortcut(APath: WideString;
  AWorkingDirectory: WideString; AArguments: WideString; ADescription: WideString;
  ALinkFileName: WideString);
var
   IObject : IUnknown;
   ISLink  : IShellLinkW;
   IPFile  : IPersistFile;
begin
   IObject := CreateComObject(CLSID_ShellLink);
   ISLink := IObject as IShellLinkW;
   ISLink.SetPath(            PWideChar(APath));
   ISLink.SetWorkingDirectory(PWideChar(AWorkingDirectory));
   ISLink.SetArguments(       PWideChar(AArguments));
   ISLink.SetDescription(     PWideChar(ADescription));
   IPFile := IObject as IPersistFile;
   IPFile.Save(PWideChar(ALinkFileName), False);
end;

PS:操作系统是Windows XP(及以上版本)。

2 个答案:

答案 0 :(得分:11)

事实证明,这个问题实际上只是Explorer shell对话框中的一个限制。生成的快捷方式文件没有260个字符的限制。只是对话框拒绝显示具有更多字符的目标。据推测,它使用固定长度的缓冲区调用GetPath

procedure TForm11.Button1Click(Sender: TObject);
var
  sl: IShellLinkW;
  pf: IPersistFile;
begin
  CoCreateInstance(CLSID_ShellLink, nil, 
    CLSCTX_INPROC_SERVER, IID_IShellLinkW, sl);
  sl.SetPath('c:\desktop\test.bat');
  sl.SetWorkingDirectory('c:\desktop\');
  sl.SetArguments(PChar(StringOfChar('x', 300)+'_the_end'));
  pf := sl as IPersistFile;
  pf.Save('c:\desktop\test.lnk', False);
end;

我的test.bat看起来像这样:

echo %1> test.out

结果test.out正好前往_the_end!

答案 1 :(得分:4)

感谢所有为此主题做出贡献的人 - 这对我帮助很大。

但是,如果可以的话,我想在制作解决方案时添加以下信息:

1)在Windows 7 Enterprise~SP1上,使用VBS to create the shortcut似乎仍然存在对(至少)arguments字段中的最大字符的限制。我在测试之前测试了多达1023个字符。我认为同样的限制同样适用于Delphi方法。

2)在Windows XP Professional~SP3上,虽然VBS方法将创建一个长度超过260个字符的快捷方式(lnk文件包含数据),但在执行时它似乎会以大约这个数字为其进行区分。