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

Ваш аккаунт

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

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

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

Идентификатор задачи

16K
14 февраля 2006 года
Z75
2 / / 14.02.2006
По службе приходится писать небольшие приложения таскающие данные из Unix. Таскает их одна утилитка, которую мы запускаем с разной периодичностью и с разными параметрами. Все приложения работают паралельно.
Т.е. каждое приложение формирует исполняемый файл (.bat), который запускается приложением и потом анализируются результаты его работы.
Собственно проблема: Возможны ситуации, что какая-то станция не отдает набора значений, тогда надо закрыть окно "C:\WINNT\system32\cmd.exe" и перейти на другую станцию. Если окно одно - то проблем 0. Но их может быть запущено одновременно с десяток.
Т.е. надо получать hwnd окна, сразу же с его запуском, дабы не получить манипулятор с другого приложения. Варианты типа:
WinExec "C:\WINNT\system32\cmd.exe" ', 2
hWnd1 = FindWindow("ConsoleWindowClass", "C:\WINNT\system32\cmd.exe")
не катят.
И еще, Shell возвращает идентификатор задачи ID, который является уникальным номером. Наверное можно его использовать, а как?
Подмогните, плз.
534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Z75
Подмогните, плз.



Могу посоветовать API.
Сначала декларации:

Код:
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
    (ByVal lpApplicationName As String, _
    ByVal lpCommandLine As String, _
    lpProcessAttributes As Integer, _
    lpThreadAttributes As Integer, _
    ByVal bInheritHandles As Long, _
    ByVal dwCreationFlags As Long, _
    lpEnvironment As Any, _
    ByVal lpCurrentDriectory As String, _
    lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long


Public Declare Sub ZeroMemory Lib "KERNEL32" Alias "RtlMoveMemory"  _
    (dest As Any, ByVal numBytes As Long)

Public Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" _
    (ByVal hProcess As Long, ByVal uExitCode As Long) As Long


Public Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
End Type

Public Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type


Теперь, собственно, код:

 
Код:
Dim si as STARTUPINFO
Dim pi as PROCESS_INFORMATION

ZeroMemory si, Len(si)
si.cb = Len(si)

Dim hProcess as Long
hProcess = CreateProcess(vbNull, "cmd", 0, 0, 0, CREATE_NEW_CONSOLE, Null, vbNull, si, pi)


Уничтожаем процесс:

 
Код:
TerminateProcess hProcess, 0
534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Упс, ошибся, hProcess (рез-тат CreateProcess) берём из pi, а функция возвращает знащение Boolean. И ещё.. HANDLE процесса нужно будет закрыть, т. е. вызвать CloseHandle pi.hProcess после вызова TerminateProcess. Enjoy!
648
14 февраля 2006 года
Tiraspolsky
220 / / 23.07.2003
Имеется функция GetWindowThreadProcessId.
Можно перебрать все окна и для каждого определить ProcessId. Если он известен, то задача решена.
534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Tiraspolsky
Имеется функция GetWindowThreadProcessId.
Можно перебрать все окна и для каждого определить ProcessId. Если он известен, то задача решена.



GetWindowThreadProcessId возвращает ID потока, который создал окно, а не процесса. Хотя, если в процессе существует лишь один поток (в нашем случае так и есть), то убийство его повлечёт за собой смерть процесса. Только убивать надо не по ID, а по HANDLE, а это разные вещи. И опять-таки HANDLE необходимо закрыть (CloseHandle), чтобы поток перестал существовать.

16K
15 февраля 2006 года
Z75
2 / / 14.02.2006
Спасиббы, заработало!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог