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

8
我正在尝试创建一个包含长参数字符串(> MAX_PATH)的快捷方式(在桌面上)。
根据MSDN文档,对于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(及以上版本)。


1
你尝试过使用\?\前缀来启用长文件名吗?例如,\?\D:\very\long\path - 参见http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx - David Heffernan
被截断的是参数、路径还是工作目录?我有一种感觉,你需要使用SetIDList而不是SetPath。 - David Heffernan
@David:当你将路径和参数组合在一起时得到的字符串(在资源管理器对话框中称为“目标”)被截断为260个字符。 - Jens Mühlenhoff
2
我认为这是 shell 对话框的限制,而不是支持它的 shell 链接底层问题。当您执行快捷方式时会发生什么?它是否表现正常? - David Heffernan
@Andriy - 这些是 IID_IShellLinkAIID_IShellLinkWCLSID_ShellLink{00021401-0000-0000-c000-000000000046}。Jens 已经在使用 IShellLinkW - Sertac Akyuz
显示剩余17条评论
2个回答

16

事实上,这个问题只是资源管理器对话框的限制。生成的快捷方式文件并没有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!


我可以确认在W7上使用D2007编译的'test.out'文件大小为311字节。 - Sertac Akyuz

7

感谢所有为这个帖子做出贡献的人-它对我有很大帮助。

然而,如果可以的话,我想在我的解决方案中添加以下信息:

  1. 在Windows 7企业版SP1上,似乎使用VBS创建快捷方式仍然存在(至少)参数字段中的最大字符限制。 我在测试了1023个字符之后才被截断。 我认为Delphi方法同样适用于相同的限制。

  2. 在Windows XP专业版SP3上,虽然VBS方法可以创建一个超过260个字符的快捷方式(lnk文件包含数据),但在执行时它似乎会在大约这个数字处被截断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接