КОРРЕКТНО завершить чужой процесс

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 1:11

Есть uProcess.th32ProcessID и hProcess. Что можно сделать - послать сообщение(?), использовать спец. API(?) или всё же придётся перебирать окна верхнего уровня, получать от их hWnd ProcessID, сравнивать с нашим uProcess.th32ProcessID и слать окну WM_QUIT?
Хм, а если процесс не имеет окна?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 24.11.2009 (Вт) 1:50

Есть функция SendThreadPostMessage и нет понятия "корректно заврешить процесс"
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 1:58

ANDLL писал(а): нет понятия "корректно заврешить процесс"

а какое понятие тогда используется для TerminateProcess?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 24.11.2009 (Вт) 2:03

Просто завершение процесса
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 10:57

какое сообщение посылается процессу без окна, для норм. его завершения?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 24.11.2009 (Вт) 11:07

Куда посылать сообщения, если окна нет?
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Денис » 24.11.2009 (Вт) 11:41

Предлагаю грязный хак (для разнообразия, сильно не бейте)

Код: Выделить всё
Private Sub cmdKillProcess(ProcessName As String, ForceExit As Boolean)
     
   Dim ckpFlag As String
   Const ckpCommand As String = "taskkill"
   
   If ForceExit Then
      ckpFlag = "/F" & Chr$(32) & "/IM"
   Else
      ckpFlag = "/IM"
   End If
   
   Shell ckpCommand & Chr$(32) & ckpFlag & Chr$(32) & ProcessName, vbHide
   
End Sub


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

cmdKillProcess ИмяПроцесса.exe, False — завершает КОРРЕКТНО
cmdKillProcess ИмяПроцесса.exe, True — завершает принудительно
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 11:45

Antonariy писал(а):Куда посылать сообщения, если окна нет?
в процедуру обработки сообщений

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 11:47

Предлагаю грязный хак (для разнообразия, сильно не бейте)
для цього е TerminateProcess.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Денис » 24.11.2009 (Вт) 11:54

Space писал(а):
Предлагаю грязный хак (для разнообразия, сильно не бейте)
для цього е TerminateProcess.

Предлагаю почитать вот эту статейку (и комменты к ней хороши) может, что пригодится?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 24.11.2009 (Вт) 15:05

Space писал(а):
Antonariy писал(а):Куда посылать сообщения, если окна нет?
в процедуру обработки сообщений
Нда, надмозг в действии.

Вопрос от Капитана Очевидность: если окна нет, по какому хэндлу ты будешь отправлять сообщения?
Философский вопрос: какой смысл в процедуре, если нет окна?
Вопрос от тети Сары: Таки окна нет или оно спрятано?
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 15:43

отвечаю на все вопросы. О чём те говорит сей код?
Код: Выделить всё
.WHILE TRUE
   invoke GetMessage, ADDR msg_,NULL,0,0
.BREAK .IF (!eax)
   invoke TranslateMessage, ADDR msg_
;   invoke DispatchMessage, ADDR msg_
.ENDW

program_end:
invoke ExitProcess,0

мабудь, сообщение WM_QUIT будет посылаться по хендлу процесса. Или треда? Сейчас потестим.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 24.11.2009 (Вт) 17:21

О чём те говорит сей код?
Обработка Распределение потоком очереди событий.
Последний раз редактировалось Antonariy 24.11.2009 (Вт) 17:58, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 17:27

вот. Окна там никакого нет.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 24.11.2009 (Вт) 17:54

вот. Окна там никакого нет.

И откуда это кому известно? Вот я написал однажды такой код:
Код: Выделить всё
    Do
        st = GetMessage(mMsg, 0, 0, 0)
        TranslateMessage mMsg
        DispatchMessage mMsg
        If st = 0 Then Exit Do
    Loop
Казалось бы, где окно? А оно есть.

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

Рискну предположить, что пример вырван из контекста, в котором окна таки создавались, иначе зачем делать цикл с Get/Translate/Dispatch? Нет окон — система вообще не будет отправлять потоку сообщения о действиях пользователя.
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 18:14

да уж нет. Прога на асме без окон, должна как-то нормально завершиться, потому там и цикл такой крутится. Вообщем, я кажется, нашёл решение - PostThreadMessage или PostQuitMessage - пока не знаю, что выбрать.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 24.11.2009 (Вт) 18:52

Так это твоя программа и ты свой поток убиваешь аки Иван Грозный — сына? Тогда зачем там Translate и Dispatch? Окон же нет.
Вообщем, я кажется, нашёл решение - PostThreadMessage или PostQuitMessage - пока не знаю, что выбрать.
Розовенькую или голубенькую? Изображение
PostQuitMessage = PostThreadMessage + WM_QUIT
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 19:01

тут что-то Тёмыч холивар раздул, я бегло прочитал, теперь в смятении, каков вывод из всего этого исследования?
viewtopic.php?f=9&t=13512&hilit=PostQuitMessage

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 24.11.2009 (Вт) 19:36

Короче.
Еще раз - никакого корректного зваршение нет.
Есть или просто завершение или отправка како нибудь сообщения треду, реагируя на которое он должен завершиться, а может и не завершиться.
То что очередь сообщений есть только если есть окна - бред сивой кобылы
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 20:18

Код: Выделить всё
То что очередь сообщений есть только если есть окна - бред сивой кобылы

А я этого и не говорил.
Кстати, почему в инете есть объявления ф-и CreateToolhelp32Snapshot Lib "toolhelp.dll" и CreateToolhelp32Snapshot Lib "kernel32" (и других ф-й по теме). Похоже, работают по любому.
И ещё - у меня не получается получить потоки указанного процесса, какие флаги надо указать? У меня так (выводит все потоки всех процессов):
Код: Выделить всё
Public Function GetThreads(ProcessID As Long, arrTreads() As THREADENTRY32) As Boolean
'Функция возвращает потоки
'Выход - массив потоков, GetThreads=False - ошибка

Dim hSnapShot As Long
Dim lRet As Long
Dim cTreads As Long
Dim hProc As Long
    ReDim arrTreads(0)
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)
    If hSnapShot = -1 Then Exit Function
    cTreads = 0
    arrTreads(cTreads).dwSize = LenB(arrTreads(cTreads))
    arrTreads(cTreads).th32OwnerProcessID = ProcessID
    lRet = Thread32First(hSnapShot, arrTreads(cTreads))
    If lRet = 0 Then
     CloseToolhelp32Snapshot hSnapShot
     Exit Function
    End If
    Do While lRet
      ReDim Preserve arrTreads(cTreads)
      arrTreads(cTreads).dwSize = LenB(arrTreads(cTreads))
      arrTreads(cTreads).th32OwnerProcessID = ProcessID
      lRet = Thread32Next(hSnapShot, arrTreads(cTreads))
      cTreads = cTreads + 1
    Loop
    CloseToolhelp32Snapshot hSnapShot
    GetThreads = True
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 24.11.2009 (Вт) 20:56

Space писал(а):И ещё - у меня не получается получить потоки указанного процесса, какие флаги надо указать? У меня так (выводит все потоки всех процессов)


Флаг SPACEBEHAV_ALWAYS_READ_MSDN_DOCUMENTATION:

TH32CS_SNAPTHREAD 0x00000004

Includes all threads in the system in the snapshot. To enumerate the threads, see Thread32First.


To identify the threads that belong to a specific process, compare its process identifier to the th32OwnerProcessID member of the THREADENTRY32 structure when enumerating the threads.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 24.11.2009 (Вт) 21:06

Был вопрос вида "Куда посылать сообщения, если окна нет?", не от тебя
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 21:12

э, Хакер, я не дочитал. Я думал за этот вариант, но не думал, что они не сделают такой фишки внутри функции. Значит, перебор всех потоков - это не тормоз.
Да, флага SPACEBEHAV_ALWAYS_READ_MSDN_DOCUMENTATION я не нашёл :) Разве что флаг HACKER_TRANSLATE_ME_MSDN_DOCUMENTATION

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 21:35

а что насчёт разных библиотек? На кой такой дубляж?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 24.11.2009 (Вт) 21:41

В msdn написано: импорт из kernel32.dll. Остальное не должно тебя волновать. Мало ли зачем, для совместимости, например, продублировали.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 24.11.2009 (Вт) 23:01

там написано
Link Library: Toolhelp.lib.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 24.11.2009 (Вт) 23:10

Это никак не относится к VB-шникам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 26.11.2009 (Чт) 18:47

А есть разница между посылом всем окнам процесса WM_QUIT и всем потокам процесса WM_QUIT?

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

Re: КОРРЕКТНО завершить чужой процесс

Сообщение alibek » 26.11.2009 (Чт) 23:06

Space писал(а):А есть разница между посылом всем окнам процесса WM_QUIT и всем потокам процесса WM_QUIT?

Разумеется есть. Второе является бредом.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 26.11.2009 (Чт) 23:15

однако, работает. Особенно, если у проги нет окон, а только цикл обработки сообщений. Да и если есть окна.

След.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 24

    TopList  
cron