Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Слежка за процессом.

18K
07 июня 2007 года
rostov-ilya
29 / / 16.04.2007
Возможно ли в VB организовать слежку за процессом, т.е. запушен процесс или нет.
405
07 июня 2007 года
Dmitrii
554 / / 16.12.2004
Вариант с использованием Win32 API:
Код:
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)

Sub Main()
Dim hSnapShot As Long, retResult As Long
Dim uProcess As PROCESSENTRY32
Dim strCurProc As String, strFindProc As String, intNumProc As Integer
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
retResult = Process32First(hSnapShot, uProcess)
strFindProc = "calc.exe"
Do While retResult
    strCurProc = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
    If StrComp(strFindProc, strCurProc, vbTextCompare) = 0 Then
        intNumProc = intNumProc + 1
    End If
    retResult = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
MsgBox "Кол-во экземпляров искомого процесса: " & intNumProc
End Sub

Вариант с использованием WMI:
 
Код:
Sub Main()
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select Name from Win32_Process Where Name = '" & strFindProc & "'")
MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
End Sub

Примечания.
1. Значение "." переменной strCompName означает, что проверка выполняется на локальном компьютере. При необходимости можно задать DNS-имя удалённого компьютера (для успешной работы нужны права локального администратора контролируемой станции).
2. WMI-вариант работает медленнее, чем API-вариант.
18K
07 июня 2007 года
rostov-ilya
29 / / 16.04.2007
Большое спасибо Dmitrii. В который раз выручаете, и помогаете осваивать VB.
В WMI Свойство Count я как понял возвращает количество запущеных прцессов с таким именем, а нету случаем свойства возвращающее количество памяти используемое процессом?
405
08 июня 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: rostov-ilya
... а нету случаем свойства возвращающее количество памяти используемое процессом?


Вот пример:

Код:
Sub Main()
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object, objItem As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select * from Win32_Process Where Name = '" & strFindProc & "'")
If objCollection.Count > 0 Then
    MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
    For Each objItem In objCollection
        MsgBox "Процесс с идентификатором " & objItem.ProcessID & " занимает в ОЗУ примерно " & objItem.WorkingSetSize & " байт(а)."
    Next objItem
Else
    MsgBox "Ни одного экземпляра искомого процесса не найдено."
End If
End Sub

Примечания.
1. Значение, возвращаемое свойством WorkingSetSize, обычно отличается от того, что показывает диспетчер задач на 1-5%.
2. Обратите внимание на то, что в запросе objWMI.ExecQuery("Select ... изменилось значение фильтра выборки (было - [color=blue]Name[/color], стало - [color=blue]*[/color], т.е. запрашиваются все имеющиеся данные об объекте, а не только имя).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог