Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Release IShellFolder

Здарова, программеры!

Есть прога на основе примера Delphi C:\Program Files\Borland\Delphi5\Demos\Virtual
Listview
Для организации сортировки списка файлов я добавил
ParentShellFolder:IShellFolder;, без этого не знаю как, да и поздно уже
переделывать.
Вся проблема в утечке ресурсов. Доходит до того, что не освобождается
до нескольких мегов памяти, что не есть хорошо. Методом научного тыка
был определен источник утечки - ParentShellFolder:IShellFolder.
Вопрос: как эту беду освободить. Через _Release глючит, может я как-то
не так его юзаю?

type
PShellItem=^TShellItem;
TShellItem=record
MenuID,FullID,ID:PItemIDList;
Empty:Boolean;
DisplayName,TypeName,FullPath:string;
ImageIndex,Size,Attributes:Integer;
ModDate:string;
ParentShellFolder:IShellFolder;
end;

var FIDList,FFindIDList:TList;

function TMainForm.ShellItem(Index:Integer):PShellItem;
begin
Result:=PShellItem(FIDList[Index]);
end;

procedure DisposePIDL(ID:PItemIDList);
var Malloc:IMalloc;
begin
if ID=nil then Exit;
OLECheck(SHGetMalloc(Malloc));
Malloc.Free(ID);
end;

procedure TMainForm.ClearIDList;
var I:Integer;
begin
for I:=0 to FIDList.Count-1 do
try
if Assigned(FIDList[I]) then
begin
DisposePIDL(ShellItem(I).ID);
DisposePIDL(ShellItem(I).MenuID);
DisposePIDL(ShellItem(I).FullID);

===Если этот кусок закомментарить то идет утечка ресурсовif ShellItem(I)^.ParentShellFolder<>nil then
begin
IShellFolder(ShellItem(I)^.ParentShellFolder)._Release;
ShellItem(I)^.ParentShellFolder:=nil;
end;
===А если нет, то Dispose(ShellItem(I)); приводит к офигенным ошибкам и
прога вылетаетtry
Dispose(ShellItem(I));
except
end;
end;
finally
//FIDList[I]:=nil;
end;
FIDList.Clear;
end;

Ответить   Томилов Александр Fri, 12 Dec 2003 05:15:32 +0500 (#33617)