На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Проверка жизнеспособности консольно приложения , как это делать с консолями?
    Всем привет=)

    Как узнать, висит ли консольное окно или нет.

    Допустим для GUI это так:
    ExpandedWrap disabled
      function IsHungAppWindow(Handle: THandle): Boolean;
      type
        TIsHungAppWindow = function(Handle: THandle): Boolean; stdcall;
      var
        IsHungAppWindow: TIsHungAppWindow;
      begin
        Result := False;
        IsHungAppWindow := GetProcAddress(GetModuleHandle('user32.dll'), 'IsHungAppWindow');
        if Assigned(IsHungAppWindow) then
          Result := IsHungAppWindow(Handle);
      end;


    как быть с консольным окном?
      Ты понимаешь, что это эвристика?
        А как это делает Windows?
          Например получение Дескриптора окна консоли так...
          ExpandedWrap disabled
            procedure TForm1.Button1Click(Sender: TObject);    
            var    
              info : TOSVersionInfo;    
              ClassName : string;    
              Title : string;    
            begin    
             {Проверяем -  Win95 или NT.}    
              info.dwOSVersionInfoSize := sizeof(info);    
              GetVersionEx(info);    
              if (info.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin    
                ClassName := 'ConsoleWindowClass';    
                Title := 'Command Prompt';    
              end else begin    
                ClassName := 'tty';    
                Title := 'MS-DOS Prompt';    
              end;    
              ShowMessage(IntToStr(FindWindow(PChar(ClassName), PChar(Title))));    
            end;


          Потом можно попробовать вашим методом.
          Не проверял но задел есть...
          Сообщение отредактировано: aster_x -
            Ну допустим дискриптор окна я получаю при помощи createprocess и AttachConsole.

            Как cделать проверку на работоспособность запущенной консольной программы?
            Для GUI окон я привёл код, и он работает с GUI окнами, с консолями всеравно пишет что программа работает, хатя на самом деле это не так.
            Сообщение отредактировано: Krid -
              Ahell
              А консольная программа написанна самим. Или она совсем "сторонняя"?
              если самим то создать флаг который должен обновляться через определенный период.
              Кодом проверять все ли в порядке. Наподобие как в TASKах языка программирования ADA.

              Добавлено
              Попробуйте вызвать функцию наподобие
              GetWindowRect()/SetWindowRect()? Или подобные оконные функции..
              И что она возращает?
              Конечно способ деревянный. Но мне кажеться что должен сработать.
                Самого очень интересует этот вопрос, однако для произвольной программы решения не нашел. К тому же прога может повиснуть, а может и запрашивать ввод, например. Возможно, во втором случае как-то поможет получение total time процесса?
                  А можно прояснить суть вопроса? Что значит "программа висит"?
                    Видимо, что зациклилась. Однако для консольного приложения, как мне кажется, разницы между while true do и ReadLn(s) никакой.
                      Цитата Fr0sT @
                      Видимо, что зациклилась. Однако для консольного приложения, как мне кажется, разницы между while true do и ReadLn(s) никакой.

                      Разница исключительно в том, что вместо TRUE вызывается функция, которая вычисляет значение логического выражения.
                      Причем, последнее - TRUE. Только одна из входящих в выражение величин может быть изменена посредством аппаратного прерывания.
                      Не думаю, чтобы эту ситуацию можно каким-либо образом отличить от "истинного" зацикливания. Разве что послать что-нибудь на стандартное устройство ввода.

                      Т.е. пока не нажмешь клавишу, все равно не поймешь, программа висит или ожидает ввода.
                        А допустим программно ввести сообщение в консольное окно, и прочитать то, что введено. Если не получилось значит процесс висит. Такое возможно?
                        Сообщение отредактировано: Ahell -
                          Я тебе советую по переулкам ходить оглядываясь.
                            Ahell, не обязательно, процесс может что-то усиленно переваривать.
                              Цитата Ahell @
                              А допустим программно ввести сообщение в консольное окно, и прочитать то, что введено. Если не получилось значит процесс висит. Такое возможно?

                              А какой в этом смысл?
                              Для конкретного приложения заранее известно, будет ли оно ожидать ввода и, как правило, что именно нужно вводить. Если нужно обеспечить прохождение этого приложения, то ввод можно осуществить заранее.
                              Для _любого_ же приложения подобные манипуляции представляются бессмысленными.

                              Не лучше ли сформулировать конкретную задачу? Вполне может оказаться, что она имеет другое гораздо более логичное решение.
                                Цитата Ahell @
                                А как это делает Windows?

                                Замечу что в Windows понятие звучит не как "приложение зависло", а как "не отвечает", т.е. окна (пользовательский интерфейс) не отвечает на сообщения которые ему посылают (обычно это какой-нить WM_CLICK, т.е. действия пользователя), в msdn это рекомендуют делать при помощи функции SendMessageTimeout и сообщения WM_NULL. В GUI приложениях окна создаются программистом и имеют свой WndProc и если оно не отвечает значит программист где-то накасячил. В консольном приложении обычно есть всего одно окно - консоль и у него свой системный WndProc который всегда отвечает на сообщения, независимо от того в каком состоянии находится само приложение.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0416 ]   [ 15 queries used ]   [ Generated: 14.05.24, 22:42 GMT ]