Jen*_*off 5 windows delphi shortcut maxlength delphi-2007
我正在尝试创建一个包含长参数字符串(> 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;
Run Code Online (Sandbox Code Playgroud)
PS:操作系统是Windows XP(及以上版本).
Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)
我test.bat看起来像这样:
echo %1> test.out
Run Code Online (Sandbox Code Playgroud)
结果test.out正好赶上_the_end!
感谢所有为此线程做出贡献的人 - 它对我帮助很大。
但是,如果可以的话,我想添加我在制定解决方案时发现的以下信息:
在 Windows 7 Enterprise ~SP1 上,使用VBS 创建快捷方式似乎仍然存在(至少)参数字段中的最大字符数限制。在被截断之前,我测试了多达 1023 个字符。我认为同样的限制也适用于 Delphi 方法。
在 Windows XP Professional ~SP3 上,虽然 VBS 方法会创建一个长度超过 260 个字符的快捷方式(lnk 文件包含数据),但在执行它时似乎会在大约这个数字处将其截断。
| 归档时间: |
|
| 查看次数: |
7933 次 |
| 最近记录: |