При работе с ярлыками в операционных системах Windows часто возникает проблема с ограничением длины пути, которое определяется константой MAX_PATH. В случае создания ярлыка с длинной строкой аргументов, эта строка может быть обрезана именно по достижению этого предела. В данной статье мы рассмотрим, как можно обойти это ограничение, используя примеры на языке Object Pascal, который часто применяется в среде разработки Delphi.
Описание проблемы
При попытке создать ярлык на рабочем столе с длинной строкой аргументов (> MAX_PATH) возникает проблема: строка обрезается ровно после достижения MAX_PATH символов. Это происходит даже несмотря на то, что документация MSDN указывает на возможность использования строк большей длины для Unicode.
Пример кода
Вот пример кода на Object Pascal, который использует интерфейс IShellLinkW для создания ярлыка:
procedure CreateShortcut(APath, AWorkingDirectory, AArguments, ADescription, 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;
Подтвержденное решение
Проблема, на самом деле, заключается в ограничении диалога оболочки Windows Explorer, а не в самом файле ярлыка. Файл .lnk не имеет ограничения в 260 символов, проблема возникает только при попытке отобразить целевой путь в диалоге. Это связано с тем, что диалог использует буфер фиксированной длины.
Пример кода, который демонстрирует создание ярлыка с длинной строкой аргументов:
procedure TForm1.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, который выводит первый аргумент в файл test.out. Результатом становится файл test.out, содержащий всю строку до конца.
Альтернативное решение
Использование VBScript для создания ярлыка на Windows 7 Enterprise ~SP1 может позволить создать ярлык с аргументами до 1023 символов. Однако при выполнении на Windows XP Professional ~SP3, даже если файл .lnk содержит данные с длиной больше MAX_PATH, они могут быть обрезаны при выполнении.
Заключение
Для обхода ограничения MAX_PATH при создании ярлыков в Windows, можно использовать техники, описанные выше. Важно понимать, что проблема не в самом файле ярлыка, а в диалоге Explorer. Создание ярлыка с помощью VBScript или Delphi и использование специальных префиксов могут помочь обойти это ограничение.
Проблема связана с ограничением длины пути в ярлыках для Windows, которое может быть обойдено с помощью специальных методов, таких как использование интерфейса IShellLinkW или VBScript, для создания ярлыков с длинными строками аргументов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.