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

Тема в разделе "Delphi - СОМ", создана пользователем set2333, 28 апр 2010.

  1. set2333

    set2333 Гость

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

    Код (Delphi):
    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 другими данными, не через эту процедуру, а потом перезаполнить спомощью её, то все работает нормально и без ошибок. Может кто знает в чем дело?
     
  2. set2333

    set2333 Гость

    Извеняюсь. Проблема решилась.
     
Загрузка...

Поделиться этой страницей