Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Получение информации о папках и файлах находящихся на данный момент в корзине

01.01.2007
unit Unit1;

 
interface
 
uses
 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 
Dialogs, StdCtrls, ShellAPI, ShlObj, ActiveX, ComCtrls, Menus;
 
// корзина отображает не всю информацию по удаленному элементу
// а только 6 позиций.
// в действительности этих позиций больше...
const
  DETAIL_COUNT
= 11;
 
type
  TForm1
= class(TForm)
    Button1
: TButton;
    ListView1
: TListView;
    PopupMenu1
: TPopupMenu;
    mnuRestore
: TMenuItem;
    procedure Button1Click
(Sender: TObject);
    procedure mnuRestoreClick
(Sender: TObject);
 
end;
 
var
  Form1
: TForm1;
 
implementation
 
{$R *.dfm}
 
// Функция взята из QDialogs...
function StrRetToString(PIDL: PItemIDList; StrRet: TStrRet;
 
Flag: String = ''): String;
var
  P
: PChar;
begin
 
case StrRet.uType of
    STRRET_CSTR
:
     
SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));
    STRRET_OFFSET
:
     
begin
        P
:= @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)];
       
SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);
     
end;
    STRRET_WSTR
:
     
if Assigned(StrRet.pOleStr) then
       
Result := StrRet.pOleStr
     
else
       
Result := '';
 
end;
 
{ This is a hack bug fix to get around Windows Shell Controls returning
    spurious
"?"s in date/time detail fields }
 
if (Length(Result) > 1) and (Result[1] = '?') and (Result[2] in ['0'..'9']) then
   
Result := StringReplace(Result, '?', '', [rfReplaceAll]);
end;
 
// Смотрим содержимое корзины...
function ViewRecycleBin(const AHandle: THandle; LV: TListView): Boolean;
var
  ppidl
, Item: PItemIDList;
 
Desktop: IShellFolder;
 
RecycleBin: IShellFolder2;
 
RecycleBinEnum: IEnumIDList;
 
Fetched, I: Cardinal;
 
Details: TShellDetails;
 
Mallok: IMalloc;
 
TmpStr: ShortString;
begin
 
Result := False;
 
if LV = nil then Exit;
  LV
.Clear;
  LV
.Columns.Clear;
  LV
.ViewStyle := vsReport;
 
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, RecycleBinEnum) = S_OK  then
         
begin
           
// Создаем колонки
           
for I := 0 to DETAIL_COUNT - 1 do
             
if RecycleBin.GetDetailsOf(nil, I, Details) = S_OK then
             
try
               
with LV.Columns.Add do
               
begin
                 
Caption := StrRetToString(Item, Details.str);
                 
Width := LV.Canvas.TextWidth(Caption) + 24;
               
end;
             
finally
               
Mallok.Free(Details.str.pOleStr);
             
end;
           
// Перечиляем содержимое корзины
           
while True do
           
begin
             
RecycleBinEnum.Next(1, Item, Fetched);
             
if Fetched = 0 then Break;
             
if RecycleBin.GetDetailsOf(Item, 0, Details) = S_OK then
             
begin
               
try
                 
TmpStr := StrRetToString(Item, Details.str);
               
finally
                 
Mallok.Free(Details.str.pOleStr);
               
end;
               
with LV.Items.Add do
               
begin
                 
Caption := TmpStr;
                 
for I := 1 to DETAIL_COUNT - 1 do
                   
if RecycleBin.GetDetailsOf(Item, I, Details) = S_OK then
                   
try
                     
SubItems.Add(StrRetToString(Item, Details.str));
                   
finally
                     
Mallok.Free(Details.str.pOleStr);
                   
end;
               
end;
             
end;
           
end;
           
Result := True;
         
end;
end;
 
procedure TForm1
.Button1Click(Sender: TObject);
begin
 
ViewRecycleBin(Handle, ListView1);
end;      
 
end.

Пример работы с корзиной можно скачать здесь:

 

rbin.zip

Автор: Rouse_

Взято из https://forum.sources.ru