// Функция восстанавливает выбранный в ListView элемент из корзины...
function RestoreElement(const AHandle: THandle; LV: TListView): Boolean;
function GetLVItemText(const Index: Integer): String;
begin
if Index = 0 then
Result := LV.Selected.Caption
else
Result := LV.Selected.SubItems.Strings[Index - 1];
end;
var
ppidl, Item: PItemIDList;
Desktop: IShellFolder;
RecycleBin: IShellFolder2;
RecycleBinEnum: IEnumIDList;
Fetched, I: Cardinal;
Details: TShellDetails;
Mallok: IMalloc;
Valid: Boolean;
Context: IContextMenu;
AInvokeCommand: TCMInvokeCommandInfo;
begin
Result := False;
if LV = nil then Exit;
if SHGetMalloc(Mallok) = S_OK then
if SHGetSpecialFolderLocation(AHandle, CSIDL_BITBUCKET, ppidl) = S_OK then
if SHGetDesktopFolder(Desktop) = S_OK then
if Desktop.BindToObject(ppidl, nil, IID_IShellFolder2, RecycleBin) = S_OK then
if RecycleBin.EnumObjects(AHandle,
SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN, RecycleBinEnum) = S_OK then
begin
// Перечиляем содержимое корзины
while True do
begin
RecycleBinEnum.Next(1, Item, Fetched);
if Fetched = 0 then Break;
Valid := False;
for I := 0 to DETAIL_COUNT - 1 do
if RecycleBin.GetDetailsOf(Item, I, Details) = S_OK then
try
// Ищем нужный нам элемент
Valid := GetLVItemText(I) = StrRetToString(Item, Details.str);
if not Valid then Break;
finally
Mallok.Free(Details.str.pOleStr);
end;
// Если выделенный элемент найден
if Valid then
begin
// Восстанавливаем его при помощи интерфейса IContextMenu
if RecycleBin.GetUIObjectOf(AHandle, 1, Item,
IID_IContextMenu, nil, Pointer(Context)) = S_OK then
begin
FillMemory(@AInvokeCommand, SizeOf(AInvokeCommand), 0);
with AInvokeCommand do
begin
cbSize := SizeOf(AInvokeCommand);
hwnd := AHandle;
// - локализация не нужна...
lpVerb := 'undelete'; // - восстановление фийла из корзины...
//lpVerb := 'properties'; // - показ диалога свойства...
//lpVerb := 'delete'; // - удаление файла из корзины...
fMask := 0;
lpDirectory := PChar(LV.Selected.SubItems.Strings[0]);
nShow := SW_SHOWNORMAL;
end;
Result := Context.InvokeCommand(AInvokeCommand) = S_OK;
Break;
end;
end;
end;
end;
end;
procedure TForm1.mnuRestoreClick(Sender: TObject);
begin
if ListView1.Selected <> nil then
if RestoreElement(Handle, ListView1) then ShowMessage('Элемент успешно восстановлен.');
end;
Это фрагмент кода Delphi, который предназначен для восстановления файла из корзины Windows с помощью API Windows Shell.
Сюда включены детали о том, что код делает:
Функция RestoreElement принимает два параметра: AHandle (указатель на текущий процесс) и LV (ссылка на объект TListView).
Функция сначала проверяет, является ли параметр LV валидным.
Затем она устанавливает различные интерфейсы COM, включая IShellFolder, IShellFolder2, IEnumIDList, IMalloc и IContextMenu.
Функция привязывает папку корзины к интерфейсу RecycleBin с помощью методов SHGetSpecialFolderLocation и Desktop.BindToObject.
Затем она перечисляет содержимое корзины с помощью метода RecycleBin.EnumObjects, который возвращает интерфейс IEnumIDList.
Функция перебирает перечисленные элементы, проверяя, соответствует ли каждый из них выбранному элементу в контроле ListView с помощью функции GetLVItemText. Если найден совпадение, она пытается восстановить файл с помощью интерфейса IContextMenu.
Обработчик события mnuRestoreClick вызывается при клике на пункт меню "Восстановить". Он вызывает функцию RestoreElement с указателем на текущий процесс и контролем ListView как параметрами, а затем отображает сообщение, если восстановление было успешным.
Некоторые предложения по улучшению кода:
Используйте более описательные имена переменных, чтобы сделать код более понятным.
Рассмотрите добавление обработки ошибок для случаев, когда интерфейсы COM или методы не работают.
Вам может потребоваться добавить дополнительные проверки, чтобы убедиться, что выбранный элемент в контроле ListView является валидным и представляет файл, который можно восстановить из корзины.
Альтернативное решение - использовать функцию ShellExecute, чтобы восстановить файл напрямую без использования интерфейса IContextMenu. Это может быть более простым подходом, но он может не обеспечивать такой же уровень настройки и контроля, как оригинальный код.
Обратите внимание, что это код assumes, что файл хранится в корзине и может быть восстановлен с помощью функции ShellExecute. Вам может потребоваться добавить дополнительные проверки или обработку ошибок в зависимости от вашего конкретного требования.
Функция восстанавливает выбранный элемент списка из корзины и выполняет соответствующие действия, такие как восстановление файла или открытие его свойства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.