Поддерживают ли ярлыки Windows очень длинные аргументы? - PullRequest
5 голосов
/ 11 февраля 2011

Я пытаюсь создать ярлык (на рабочем столе), содержащий длинную строку аргумента (> 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 (и выше).

Ответы [ 2 ]

11 голосов
/ 11 февраля 2011

Оказывается, что эта проблема на самом деле является единственным ограничением в диалоге оболочки Explorer.Сгенерированный файл ярлыка не имеет ограничения в 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;

My test.bat выглядит следующим образом:

echo %1> test.out

Полученный test.out идет прямо к _the_end!

4 голосов
/ 14 сентября 2012

Спасибо всем, кто внес вклад в эту тему - она ​​мне очень помогла.

Однако, если можно, я хотел бы добавить нижеприведенную информацию, которую я обнаружил при разработке своего решения:

1) В Windows 7 Enterprise ~ SP1 может показаться, что при использовании VBS для создания ярлыка все еще существует ограничение на максимальное количество символов в (как минимум) поле аргументов. Я проверил до 1023 символов, прежде чем он был обрезан. Я предполагаю, что такой же лимит будет применяться и к методу Дельфи.

2) В Windows XP Professional ~ SP3, хотя метод VBS создает ярлык длиной более 260 символов (файл lnk содержит данные), он, кажется, обрезает его примерно до этого числа при выполнении.

...