Помогите с структурированными хранилищами!

  • Автор темы set2333
  • Дата начала
S

set2333

#1
Здравствуйте!!!
Есть процедура

Код:
procedure GetHashUsr(path : PWideChar);
var
stg : IStorage;
enum : ienumstatstg;
data : tstatstg;
strm : IStream;
buf : PChar;
m : Int64;
i, u, p, dch : integer;
StrUserHash, strUser : array[0..255, 0..1] of string;
strhash : string;
begin
StgOpenStorage(path, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, stg);
Stg.EnumElements(0, nil, 0, enum);
i := 0;
try
while enum.Next(1, data, nil) = S_OK do
begin
m := data.cbSize;
stg.OpenStream(data.pwcsName, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, 0, strm);
GetMem(buf, m);
strm.Read(buf, m, nil);
if data.pwcsName <> 'Container.Contents' then
begin
strhash := buf[9] + buf[10] + buf[11] + buf[12] + buf[13] + buf[14] + buf[15] + buf[16]
+ buf[17] + buf[18] + buf[19] + buf[20] + buf[21] + buf[22] + buf[23] + buf[24] + buf[25] + buf[26]
+ buf[27] + buf[28] + buf[29] + buf[30] + buf[31] + buf[32] + buf[33] + buf[34] + buf[35] + buf[36]
+ buf[37] + buf[38] + buf[39] + buf[40];
StrUserHash[i, 0] := data.pwcsName;
StrUserHash[i, 1] := strhash;
i := i + 1;
end
else
begin
strhash := PChar(buf);
u := 0;
p := Pos('UserItemType","' ,strhash);
while p <> 0 do
begin
dch := 0;
delete(strhash, 1, p + 14);
while strhash[dch] <> '"' do
begin
dch := dch + 1;
end;
strUser[u, 0] := Copy(strhash, 0, dch - 1);
delete(strhash, 1, dch + 2);
dch := 0;
while strhash[dch] <> '"' do
begin
dch := dch + 1;
end;
strUser[u, 1] := Copy(strhash, 0, dch - 1);
p := Pos('UserItemType","' ,strhash);
u := u + 1;
end;
FreeMem(buf);
end;
end;
finally
strm := nil;
stg := nil;
enum := nil;
end;

Form2.StringGrid1.RowCount := u + 1;
for i := 0 to u do
begin
p := 0;
while p <> u do
begin
if StrUserHash[i, 0] = strUser[p, 0] then
begin
Form2.StringGrid1.Cells[0, i + 1] := strUser[p, 1];
if Form2.StringGrid1.Cells[1, i + 1] <> 'Пароль неизвестен' then
begin
if strUserHash[i, 1] = 'D41D8CD98F00B204E9800998ECF8427E' then
begin
Form2.StringGrid1.Cells[1, i + 1] := 'Пароль незадан';
end
else
begin
Form2.StringGrid1.Cells[1, i + 1] := 'Пароль неизвестен';
end;
end;
Form2.StringGrid1.Cells[2, i + 1] := strUserHash[i, 1];
end;
p := p + 1;
end;
end;
end;
Работает нормально. StringGrid1 заполняеться. Но если после выполнения процедуры закрыть программу, или переключиться на другую вкладку а потом вернуться назад (в приложении используется PageControl), то выскакивают ошибки. Причем если заполнить StringGrid другими данными, не через эту процедуру, а потом перезаполнить спомощью её, то все работает нормально и без ошибок. Может кто знает в чем дело?