Aleksandr N
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Попробую здесь спросить, может кто что подскажет... Есть программа которая показывает открытые окна. Всё как-бы работает нормально, но перманентно возникает AV и такая что срубает программу. Поэтому и отловить сложно и в принципе не понимаю почему такое может возникать, хотя как-бы должно быть всё правильно. Идёт проверка не равен ли объект нулю, но всё равно с уничтожением что-то проходит не так и даже try except не помогает. Код почти полный, только убрано лишнее чтобы не мешалось. Может кто что хорошее подскажет хорошее? Спасибо. Код: function EnumWindowsProc(WHandle: HWND; List: TStrings): Boolean; stdcall; var WinStyles: NativeInt; WinText: array[Byte] of Char; strTmp: string; AI: PWindowsInfo; begin Result := True; try WinStyles := {$IFDEF CPUX64}GetWindowLongPtr{$ELSE}GetWindowLong{$ENDIF}(WHandle, GWL_STYLE); if (WinStyles and WS_VISIBLE) = WS_VISIBLE) then begin if GetWindowText(WHandle, PChar(@WinText), SizeOf(WinText)) <> 0 then begin strTmp := Trim(string(WinText)); if strTmp <> '' then begin New(AI); AI.Caption := strTmp; AI.Handle := WHandle; List.AddObject(IntToStr(WHandle), TObject(AI)); <---- Добавляется объект в лист по индексу end; end; end; except end; end; procedure GetAllWindow(List: TStrings); begin EnumWindows(@EnumWindowsProc, LPARAM(Integer(List))); end; procedure TSetForm.ShowWindowsList; var List: TStrings; I, Index: Integer; AItem: TListItem; AI, NewAI: PWindowsInfo; ClearList: Boolean; begin try ClearList := False; List := TStringList.Create; try GetAllWindow(List); try for I := 0 to HideTaskLV.Items.Count - 1 do begin AItem := HideTaskLV.Items[I]; if AItem = nil then Continue; if AItem.Data <> nil then AI := PWindowsInfo(AItem.Data) else Continue; try Index := List.IndexOf(IntToStr(AI.Handle)); if Index <> -1 then begin NewAI := PWindowsInfo(List.Objects[Index]); if NewAI = nil then Continue; AItem.Caption := NewAI.Caption; AItem.SubItems.Strings[0] := IntToStr(NewAI.Handle); AItem.Data := NewAI; if List <> nil then List.Delete(Index); end else begin if HideTaskLV.Items[I] <> nil then HideTaskLV.Items.Delete(I); ClearList := True; end; finally try if AI <> nil then begin Dispose(PWindowsInfo(AI)); <---- AV в модуле SysUtils PWindowsInfo(AI) := nil; end; except end; end; end; for I := 0 to List.Count - 1 do begin NewAI := PWindowsInfo(List.Objects[I]); if NewAI = nil then Continue; AItem := HideTaskLV.Items.Add; AItem.Data := nil; AItem.Caption := NewAI.Caption; AItem.SubItems.Add(IntToStr(NewAI.Handle)); AItem.Data := NewAI; end; finally HideTaskLV.AlphaSort; end; finally try if ClearList then if List <> nil then for I := 0 to List.Count - 1 do begin if List.Objects[I] <> nil then begin Dispose(PWindowsInfo(List.Objects[I])); List.Objects[I] := nil; end; end; if List <> nil then FreeAndNil(List); except end; end; except for I := 0 to HideTaskLV.Items.Count - 1 do begin try if HideTaskLV.Items[I].Data <> nil then begin Dispose(PWindowsInfo(HideTaskLV.Items[I].Data)); HideTaskLV.Items[I].Data := nil; end; except end; end; HideTaskLV.Items.Clear; end; end; |
|