Контроль за приложениями

Ответы на вопросы, чаще всего задаваемые в форумах VBStreets. Для тех, кому лень искать.
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Контроль за приложениями

Сообщение hCORe » 07.06.2004 (Пн) 14:52

Совсем недавно на форумах задавали вопрос: "А можно ли проследить завершение процесса?"
Оказывается, не только можно, но и нужно 8)

Всю необходимую работу выполнит функция WaitForSingleObject API:

Код: Выделить всё
Private Declare Function WaitForSingleObject Lib "kernel32.dll" ( _
    ByVal hHandle As Long, _
    ByVal dwMilliseconds As Long) As Long


Объявим также константы:

Код: Выделить всё
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFF
Private Const WAIT_FAILED = -1&
Private Const WAIT_OBJECT_0 = 0
Private Const WAIT_ABANDONED = &H80&
Private Const WAIT_ABANDONED_0 = &H80&
Private Const WAIT_TIMEOUT = &H102&


Всю работу будет выполнять функция WaitForTerm:

Код: Выделить всё
Private Sub WaitForTerm(hProcess As Long, hThread As Long)
    Dim res&
    ' Здесь - любые действия по инициализации
   
    ' Произвести инициализацию процесса
    Call WaitForInputIdle(hProcess, INFINITE)

    If hThread <> 0 Then _
    Call CloseHandle(hThread)
    Do Until WaitForSingleObject(hProcess, 0) <> WAIT_TIMEOUT
        DoEvents
    Loop

    Call CloseHandle(hProcess)
    ' Здесь - любые действия по деинициализации

End Sub


Все это замечательно, однако, как следить за созданным при помощи функции CreateProcess API приложением? Оказывается, это проще, чем вы это могли себе представить. Немного модифицируем созданную нами функцию WaitForTerm. Сначала добавим объявление структуры PROCESS_INFORMATION, заполняемой при вызове CreateProcess:

Код: Выделить всё
Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessId As Long
   dwThreadId As Long
End Type


Теперь - непосредственно код функции:

Код: Выделить всё
Private Sub WaitForTerm2(pinfo As PROCESS_INFORMATION)
    WaitForTerm pinfo.hProcess, pinfo.hThread
End Sub


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

И, под конец, небольшой проект "Application Control", использующий функцию WaitForSingleObject:
http://amelso.narod.ru/testing/appcontrol.zip
Моду создают модоки, а распространяют модозвоны.

Вернуться в Популярные вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList