Слежение за программой по коду hCORe - A можно ли вот так ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Слежение за программой по коду hCORe - A можно ли вот так ?

Сообщение ALX_2002 » 28.06.2005 (Вт) 10:37

Заранее извиняюсь перед модераторами за то, что выкладываю текст кода, а не присоединяю приложение. К сожалению иначе не будет понятен мой вопрос. :oops:

Отцы. Может быть я не прав, но вроде работает. Возможно это поможет другим.

В теме - "популярные вопросы", господин hCORe
рассмотрел ОФИГЕННЫЙ :roll: пример слежения за программой. ( Мне очень помог !!!)

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


Я решил попробывать немного изменить код. Мне нужно было следить за выполнением моей программы из модуля, так что весь код сразу перетащил именно в него.

Как я понял, вся проблема в циклах Do Loop
Дальше вспомнил, что Tyomitch ( Респект ему огромный ) писал, что удобно для торможения цикла (чтобы не грузить процессор на 100%)поставить WaitMessage

Что я и сделал...

Вот что получилось

Код: Выделить всё
'переменные
Dim sinfo As STARTUPINFO
Dim pinfo As PROCESS_INFORMATION

'константы API
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFF
Private Const DEBUG_PROCESS = &H1
Private Const DEBUG_ONLY_THIS_PROCESS = &H2
Private Const CREATE_SUSPENDED = &H4
Private Const DETACHED_PROCESS = &H8
Private Const CREATE_NEW_CONSOLE = &H10
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const IDLE_PRIORITY_CLASS = &H40
Private Const HIGH_PRIORITY_CLASS = &H80
Private Const REALTIME_PRIORITY_CLASS = &H100

Private Const CREATE_NEW_PROCESS_GROUP = &H200
Private Const CREATE_NO_WINDOW = &H8000000

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&

Private Const SW_SHOW = 5

'структуры API
Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type

Private 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

'функции API

'открытие процесса
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'закрытие объекта по модификатору
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'ожидание объекта
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
'создание процесса
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
'ожидание инициализации процесса
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
'уничтожение процесса по модификатору
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long

' Эта процедура позволяет выполнять эффективное
' ожидание завершения приложения
' pinfo - структура типа PROCESS_INFORMATION,
' заполняемая при вызове CreateProcess

Private Sub WaitForTerm2(pinfo As PROCESS_INFORMATION)
    Dim res&
    ' Произвести инициализацию процесса
    Call WaitForInputIdle(pinfo.hProcess, INFINITE)
    ' Уничтожить модификатор нити
    If hThread <> 0 Then
        Call CloseHandle(pinfo.hThread)
    End If
    Do
        res = WaitForSingleObject(pinfo.hProcess, 0)
        If res <> WAIT_TIMEOUT Then
            ' Приложение завершается!
            MsgBox "PROGRAM CLOSED"
           Exit Do
        End If
    WaitMessage
       DoEvents
    Loop While True
    ' Уничтожить последний модификатор процесса
    Call CloseHandle(pinfo.hProcess)
End Sub
Sub main()
Dim rc As Long, rRc As Long
    sinfo.cb = Len(sinfo) 'длина
    sinfo.lpReserved = vbNullString
    sinfo.lpDesktop = vbNullString
    sinfo.lpTitle = "OUR PROGRAM" 'vbNullString 'заголовок
    sinfo.dwFlags = 0 'флаги
    za = HIGH_PRIORITY_CLASS 'NORMAL_PRIORITY_CLASS 'установим приоритет задачи
    'запустим WinRar
    rc = CreateProcess("C:\windows\system32\cmd.exe", "", 0, 0, True, za, ByVal 0&, vbNullString, sinfo, pinfo)
    'запустим ожидание
    WaitForTerm2 pinfo
End Sub


А вот теперь собственно вопросы.

1) Хотел узнать - не повлияет ли WaitMessage на перехват ивентов ?
2) Что делают параметры

sinfo.lpReserved = vbNullString
sinfo.lpDesktop = vbNullString
Последний раз редактировалось ALX_2002 28.06.2005 (Вт) 19:04, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2005 (Вт) 11:39

"модификатор" - это кто придумал, ты или ANDLL? :-)

зачем тут вызов WaitForInputIdle - не понял вообще :-?

Вместо "Loop While True" можно написать просто "Loop". Вообще, цикл как-то коряво написан... Почему не
Код: Выделить всё
Do While WaitForSingleObject(pinfo.hProcess, 0) = WAIT_TIMEOUT
    WaitMessage
    DoEvents
Loop
' Приложение завершается!
MsgBox "PROGRAM CLOSED"
:?:

И чем Waiter! от GSerg-а не устроил? Там всё так же, только никаких тормозов нет.

1) не должон, т.к. евенты возникают в результате прихода сообщений, а не сами по себе

2)
MSDN писал(а):lpReserved
Reserved. Set this member to NULL before passing the structure to CreateProcess.
lpDesktop
Windows NT/2000: Pointer to a null-terminated string that specifies either the name of the desktop only or the name of both the desktop and window station for this process. A backslash in the string pointed to by lpDesktop indicates that the string includes both desktop and window station names. If lpDesktop is NULL, the new process inherits the desktop and window station of its parent process. If lpDesktop is an empty string, the process does not inherit the desktop and window station of its parent process; instead, the system determines if a new desktop and window station need to be created. If the impersonated user already has a desktop, the system will use the existing desktop.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 11:47

2 Tyomitch:

1) УХ ! :shock:

2)
зачем тут вызов WaitForInputIdle - не понял вообще


Ня знаю. Код, то не мой :oops: :)

"модификатор" - это кто придумал, ты или ANDLL?


Чес слово - я придумал, только WaitMessage. И то не придумал, а от тебя узнал. :D

И чем Waiter! от GSerg-а не устроил? Там всё так же, только никаких тормозов нет.


Не видел :shock: . А он там же лежит ? В популярных вопросах или в проектах ? Сейчас пойду гляну. :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2005 (Вт) 11:49

В кирпичах он лежит.

А я сейчас тогда всю свою критику скопипасчу в топик ANDLL...
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 11:53

2 Tyomitch:

1) Ага. Поиск рулит. Всё нашёл. :)

2) Ну вот.... Подставил человека.... :oops:

А может не надо, а.. ? :( . А то расстроится чел. :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.06.2005 (Вт) 12:19

ALX_2002 писал(а):
И чем Waiter! от GSerg-а не устроил? Там всё так же, только никаких тормозов нет.


Не видел :shock: . А он там же лежит ? В популярных вопросах или в проектах ? Сейчас пойду гляну. :D


В Кирпичах.


Вообще. Зачем я завёл топик с перечнем всей продукции кирпичного завода? Блин, хоть бы кто его читал время от времени - всё ж для вас :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 12:45

2 Gserg: Поглядел :shock: . Круто ! Код в 2 строки, а пашет ни чем не хуже.

Только вот опять вопр. Такой же вопр как в твоём посте. :( (Если я правильно понял)

Как отследить завершения себя, если прога состоит из модуля ? :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.06.2005 (Вт) 15:27

Ы :shock:


Сам понял чё спросил? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 15:30

Сам то понял.... И с той же траблой и сижу. :D

Есть модуль

В модуле допустим

Код: Выделить всё
Do

'код

WaitMessage
Doevents
Loop


Пока цикл крутится, прога работает.... Вот и хотел узнать, как определить её завершение. Допустим я её как процесс рублю. Или в VB на стоп нажимаю. Вот хотел узнать - чего делать ? :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.06.2005 (Вт) 15:34

Ещё раз спрошу, с робкой надеждой :)

Сам понял, чё спросил? :)
Если ты нажал на стоп или если ты убиваешь процесс, то процесс об этом не узнает :)


Суть проги в чём?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 16:05

2 Gserg: Ну так сразу бы и сказал. :D Я ж не гений и никогда не претендовал на такое звание. Что-то знаю, что-то нет. Иногда самые бредовые идеи оказываются реально выполнимыми. :shock:

А по вопросу - Сам то понял, что спросил. Я логично сделал вывод, что не совсем корректно задал вопрос. :roll:

По идее же VB временно компилит EXE, а потом его рубит. У них ведь есть связь. Вспомнил, что процессу должно что то приходить, для того, чтобы он вырубился. Из чего сделал вывод, что VB делает TerminateProcess или что то ещё.... Наивно думал, что его можно перехватить. Вот... :(

А сделать хотел Winsock Server. ( http://bbs.vbstreets.ru/viewtopic.php?t=17321 )

Мне нужно как то ловить событие отключения своей программы, чтобы корректно осовобождать порт... :oops:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.06.2005 (Вт) 16:16

А отключение программы должно происходить в каких случаях? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 16:22

Хм... Ну если вдруг порт уже занят... Или программу отрубают через диспетчер задач... :roll:

Да и в отладчике я иногда с дуру жму на стоп, а не на ESC ( по которой прога останавливается ) - Знаю сам виноват

В принципе в откомпиленной версии.... Не.. не знаю...

В тупик поставил :D



Т.е лучше ограничиться просто проверкой нужнонажатой клавиши, чтобы отрубить EXE -ник ? :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.06.2005 (Вт) 16:31

Нет, я не понимаю, чё тебе надо :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 16:45

2 Gserg: Ну канеШна, запутал меня сАвсем ! :D :D :D

Я теперь и сам уже не знаю, как быть. Как свою прогу убить и поймать себя за руку, чтоб узнать когда я это делаю ?

Ааа ?! Шо ?! Кто это сказал ?! Это я в слух....?

Тихо шифером шурша...... Крыша едет неспеша... :drunken: :bounce: :alien: :cyclopsani:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2005 (Вт) 18:57

ALX_2002 писал(а):По идее же VB временно компилит EXE, а потом его рубит. У них ведь есть связь. Вспомнил, что процессу должно что то приходить, для того, чтобы он вырубился. Из чего сделал вывод, что VB делает TerminateProcess или что то ещё....

Неправда это всё. Когда прога запущена из-под IDE, то она компилируется не в ехе, а в псевдокод, и выполняется в том же процессе, что сама IDE. Соответственно, TerminateProcess не вызывается :-)

У Рэймонда Чена была статья "Почему процесс не может перехватить TerminateProcess". Если кратко, то: так задумано. Без этого всё хуже.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2005 (Вт) 18:59

ALX_2002, если я правильно понял что тебе нужно, то - don't worry, be happy. Винда уничтожит всё, что осталось от твоей программы - все открытые файлы, сокеты и т.п. - при закрытии её процесса, тебе для этого никаких усилий прилагать не надо.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.06.2005 (Вт) 18:59

Во я кривой ! Это пример hCORe. Приношу свои глубочайшие извинения !!! :oops: :oops: :oops:

2 Tymoitch: Ух... Сдаюсь - пойду учить мат часть и лечить голову. :shock: :(

2) А почему VB выпадает с ошибкой, если я сокет не закрыл ? :shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.06.2005 (Чт) 11:39

ALX_2002 писал(а):Во я кривой ! Это пример hCORe. Приношу свои глубочайшие извинения !!! :oops: :oops: :oops:

2 Tymoitch: Ух... Сдаюсь - пойду учить мат часть и лечить голову. :shock: :(

2) А почему VB выпадает с ошибкой, если я сокет не закрыл ? :shock:

Сокет АПИшный? Из-за того, что у тебя окно сабклассируется. Прежде чем закрывать прогу, надо восстановить WindowProc.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

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

    TopList