我正在尝试创build一个包含长参数string(> MAX_PATH)的快捷方式(在桌面上)。
MSDN文档明确指出,对于Unicodestring,string可能比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:OS是Windows XP(及以上)。
事实证明,这个问题实际上仅仅是在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)在Windows 7 Enterprise〜SP1上,似乎使用VBS创建快捷方式仍然限制(至少)参数字段中的最大字符数。 在我被扼杀之前,我测试了1023个字符。 我想同样的限制也适用于德尔菲法。
2)在Windows XP Professional〜SP3上,当VBS方法创建一个超过260个字符的快捷方式(lnk文件包含数据)时,它似乎在执行它时大约在这个数字上。