Starting from Windows Vista it is possible to use IFileOperation to restore any object from RecycleBin to any folder. Sample of usage:
procedure RestoreItem(AShellFolder: IShellFolder; AChild: PItemIDList; const ADestFolder: UnicodeString);
var
Item: IShellItem;
DestFolder: IShellItem;
FileOperation: IFileOperation;
begin
OleCheck(SHCreateItemWithParent(nil, AShellFolder, AChild, IShellItem, Item));
try
OleCheck(SHCreateItemFromParsingName(PWideChar(ADestFolder), nil, IShellItem, DestFolder));
try
OleCheck(CoCreateInstance(CLSID_FileOperation, nil, CLSCTX_ALL, IFileOperation, FileOperation));
try
OleCheck(FileOperation.MoveItem(Item, DestFolder, nil, nil));
OleCheck(FileOperation.PerformOperations);
finally
FileOperation := nil;
end;
finally
DestFolder := nil;
end;
finally
Item := nil;
end;
end;