Конференция "WinAPI" » Вылетает с ошибкой (периодически) [D7, WinXP]
 
  • ms.krabs (13.07.10 21:20) [0]
    Есть проблема, запускаю поток который должен закрывать зависшие приложения. Но периодически возникает AcessViolation, т.е. 2 из 3 - ошибка. Без него проблем нет. Проблемы в CloseWin нет.

    procedure CloseWin(h:HWND); //Убивание процесса
    var
     PID:Cardinal;
     hProc:Cardinal;
    begin
     GetWindowThreadProcessId(h,PID);
     hProc:=OpenProcess(PROCESS_TERMINATE,true,PID);
     TerminateProcess(hProc,0);
     CloseHandle(hProc);
    end;

    procedure Close; //Поиск зависших окон
    var
     h:HWND;
     n:Array[0..255] of Char;
    begin
     h:=FindWindow(nil,nil);
     while (h<>0) do
     begin
       GetWindowText(h,n,255);
       if (pos(CAPTION,n)>0) and (pos('отвечает',n)>0) then
       begin
         CloseWin(h);
         Exit;
       end;
       h := GetNextWindow(h,GW_HWNDNEXT);
     end;
    end;

    procedure CloseThread; //Поток поиска
    begin
     while true do
     begin
       Close;
       Sleep(10000);
     end;
    end;

  • Leonid Troyanovsky © (14.07.10 07:56) [1]

    > ms.krabs   (13.07.10 21:20)  

    > n:Array[0..255] of Char;

    Чего это сразу 255?

    > FindWindow(nil,nil);

    EnumWindows

    > pos(CAPTION,n)

    AnsiStrPos

    > procedure CloseThread; //Поток поиска

    Чего-чего?

    --
    Regards, LVT.
  • brother © (15.07.10 08:39) [2]
    Имена процедур не соответсвуют коду внутри, вот и путаница...
  • Leonid Troyanovsky © (15.07.10 08:53) [3]

    > brother ©   (15.07.10 08:39) [2]

    > Имена процедур не соответсвуют коду внутри, вот и путаница.

    Не путаница, а AV.
    Потому, что функция потока не соответствует ни одному
    разумному прототипу.

    И, во-ще, оный код легче выкинуть, чем поправить.

    --
    Regards, LVT.
  • brother © (15.07.10 09:30) [4]
    согласен
  • Anatoly Podgoretsky © (15.07.10 10:41) [5]

    > Leonid Troyanovsky ©   (15.07.10 08:53) [3]

    По нашему по русски - и переписать все нафиг.
  • _Юрий (16.07.10 21:38) [6]
    Вероятно, поток создается через API, и флаг для менеджера памяти не выставлен
  • Deltas © (16.07.10 23:39) [7]

    > Leonid Troyanovsky ©   (15.07.10 08:53) [3]
    > Потому, что функция потока не соответствует ни одному
    > разумному прототипу.

    А там нет функции потока. Можно только предположить, что CloseThread вызывается из функции потока.
    ms.krabs   (13.07.10 21:20) [0]
    Показывайте как поток создаете.
  • Leonid Troyanovsky © (17.07.10 12:28) [8]

    > Deltas ©   (16.07.10 23:39) [7]

    > А там нет функции потока.

    Я собс-ными глазами прочел комментарий,
    и мое предположение ничем не хуже

    > Можно только предположить, что CloseThread вызывается из
    > функции потока.


    > Показывайте как поток создаете.

    Автор давно уже загорает на берегу водоема.

    --
    Regards, LVT.
 
Конференция "WinAPI" » Вылетает с ошибкой (периодически) [D7, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.001]