uses
ShlObj,
ComObj,
ActiveX,
CommCtrl;
type
PShellLinkInfoStruct = ^TShellLinkInfoStruct;
TShellLinkInfoStruct = record
FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char;
FullPathAndNameOfFileToExecute: array[0..MAX_PATH] of Char;
ParamStringsOfFileToExecute: array[0..MAX_PATH] of Char;
FullPathAndNameOfWorkingDirectroy: array[0..MAX_PATH] of Char;
Description: array[0..MAX_PATH] of Char;
FullPathAndNameOfFileContiningIcon: array[0..MAX_PATH] of Char;
IconIndex: Integer;
HotKey: Word;
ShowCommand: Integer;
FindData: TWIN32FINDDATA;
end;
procedure GetLinkInfo(lpShellLinkInfoStruct: PShellLinkInfoStruct);
var
ShellLink: IShellLink;
PersistFile: IPersistFile;
AnObj: IUnknown;
begin// access to the two interfaces of the object
AnObj := CreateComObject(CLSID_ShellLink);
ShellLink := AnObj as IShellLink;
PersistFile := AnObj as IPersistFile;
// Opens the specified file and initializes an object from the file contents.
PersistFile.Load(PWChar(WideString(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile)), 0);
with ShellLink dobegin// Retrieves the path and file name of a Shell link object.
GetPath(lpShellLinkInfoStruct^.FullPathAndNameOfFileToExecute,
SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile),
lpShellLinkInfoStruct^.FindData,
SLGP_UNCPRIORITY);
// Retrieves the description string for a Shell link object.
GetDescription(lpShellLinkInfoStruct^.Description,
SizeOf(lpShellLinkInfoStruct^.Description));
// Retrieves the command-line arguments associated with a Shell link object.
GetArguments(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute,
SizeOf(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute));
// Retrieves the name of the working directory for a Shell link object.
GetWorkingDirectory(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy,
SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy));
// Retrieves the location (path and index) of the icon for a Shell link object.
GetIconLocation(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon,
SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon),
lpShellLinkInfoStruct^.IconIndex);
// Retrieves the hot key for a Shell link object.
GetHotKey(lpShellLinkInfoStruct^.HotKey);
// Retrieves the show (SW_) command for a Shell link object.
GetShowCmd(lpShellLinkInfoStruct^.ShowCommand);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
br = #13#10;
var
LinkInfo: TShellLinkInfoStruct;
s: string;
begin
FillChar(LinkInfo, SizeOf(LinkInfo), #0);
LinkInfo.FullPathAndNameOfLinkFile := 'C:\WINNT\Profiles\user\Desktop\FileName.lnk';
GetLinkInfo(@LinkInfo);
with LinkInfo do
s := FullPathAndNameOfLinkFile + br +
FullPathAndNameOfFileToExecute + br +
ParamStringsOfFileToExecute + br +
FullPathAndNameOfWorkingDirectroy + br +
Description + br +
FullPathAndNameOfFileContiningIcon + br +
IntToStr(IconIndex) + br +
IntToStr(LoByte(HotKey)) + br +
IntToStr(HiByte(HotKey)) + br +
IntToStr(ShowCommand) + br +
FindData.cFileName + br +
FindData.cAlternateFileName;
Memo1.Lines.Add(s);
end;
Программа на Delphi, которая извлекает информацию о файле-ссылке (ссылке) с помощью интерфейсов IShellLink и IPersistFile. Программа читает содержимое файла-ссылки, извлекает различные свойства, такие как путь целевого файла, описание, аргументы командной строки, рабочий каталог, местоположение иконки, горячая клавиша, команда отображения и имя файла, и отображает их в компоненте memo.
Разбивка кода:
Первый раздел определяет типы PShellLinkInfoStruct и TShellLinkInfoStruct, которые представляют указатель на структуру, содержащую различные свойства, связанные с файлом-ссылкой.
Процедура GetLinkInfo принимает указатель на TShellLinkInfoStruct в качестве параметра входного. Она создает экземпляр интерфейса IShellLink с помощью COM, загружает файл-ссылку, указанный свойством FullPathAndNameOfLinkFile, и затем извлекает различные свойства из файла-ссылки.
Процедуры GetPath, GetDescription, GetArguments, GetWorkingDirectory, GetIconLocation, GetHotKey и GetShowCmd используются для извлечения конкретных свойств из файла-ссылки.
Процедура Button1Click является обработчиком события клика кнопки. Она создает экземпляр TShellLinkInfoStruct, устанавливает свойство FullPathAndNameOfLinkFile в конкретное значение, вызывает процедуру GetLinkInfo для извлечения свойств файла-ссылки и затем отображает результаты в компоненте memo.
Код generally well-organized и легко понятен. Однако есть несколько вещей, которые можно улучшить:
Обработка ошибок: программа не обрабатывает ошибки, которые могут возникнуть при загрузке файла-ссылки или извлечении его свойств. Хорошо бы добавить блоки try-except для ловли исключений, которые могут быть вызваны.
Восстановление кода: процедура GetLinkInfo извлекает несколько свойств из файла-ссылки и хранит их в локальной переменной. Рассмотрите создание отдельной процедуры для каждого свойства, чтобы код был более модульным и повторно используемым.
Читаемость кода: некоторые части кода можно улучшить для читаемости, используя более описательные имена переменных и добавляя пробелы для разделения логических частей кода.
В целом, это хороший старт для программы, извлекающей информацию о файле-ссылке. С дополнительной обработкой ошибок и рефакторингом кода она может стать еще более robust и maintainable.
Показано, как получить информацию о ярлыке (Shell link) в дельфийском приложении с помощью интерфейса IShellLink и IPersistFile.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.