Как завершить процесс?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Как завершить процесс?

Сообщение Scuder » 13.05.2004 (Чт) 14:31

Есть запущенное приложение. ShowInTaskbar = False. В процессах, естественно, висит.. W2K. Как завершить выполнение программы? Только без DDE. Нужно просто послать приложению команду "завершиться". Догадываюсь, что нужно использовать SendMessage, но не знаю как.. Может, есть у кого-нибудь примерчик?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 13.05.2004 (Чт) 14:33

WM_QUIT

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.05.2004 (Чт) 15:04

Посмотри, может поможет:
Вложения
Список запущенных процессов.zip
(2.53 Кб) Скачиваний: 54
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Tamahawk
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 03.02.2004 (Вт) 22:11

Сообщение Tamahawk » 13.05.2004 (Чт) 15:11

можеш использовать WMI terminate и вообще поиши про это в инете отличная вешь

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 13.05.2004 (Чт) 15:29

2 Sirik:

Thx, примерчик работает.. Только есть некоторые сомнения..
Неизвестно что происходит при вызове TerminateProcess..

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

Вот Ennor (как всегда лаконично.. ;-) ) говорит "WM_QUIT". Ну допустим.

Тогда:

Код: Выделить всё
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_QUIT = &H10


Private Sub Command1_Click()

SendMessage Proc_HWND, WM_QUIT, 0, 0

End Sub


Этот код должен закрывать программу. Но т.к. ShowInTaskbar = False, по FindWindow я не могу найти hwnd приложения. А есть ли вообще hwnd, если самого окна нет? Или я затупил? Короче, чтобы код заработал, нужно найти hwnd процесса, если известен его ID и имя приложения.. Возможно?

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.05.2004 (Чт) 15:35

2 Scuder Не знаю как у тебя, но у меня всё рабоет просто идеально.
Для проверки я открыл Диспетчер задач и свою прогу. В прогре убил процесс, в Диспетчере сразу процесс исчер, причём осободил память, которую занимал.
Или я просто не понимаю проблемы???
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 13.05.2004 (Чт) 15:52

Ты понимаешь, я тут хренью занимаюсь, используя Windows Media Player.. Так эта собака нормально работает, но если он на форме, и запускается до 10 раз в минуту, то рано или поздно (в моём случае ~10-12 часов) в Windows заканчивается виртуальная память, т.к. хоть контрол и выгружается, за собой не смывает, гнида!! И всё приложение вылетает. Я пошёл другим путём - запускаю по таймеру не контрол, а отдельное приложение с этим контролом. После выгрузки приложения память очищается нормально. Но это после нормальной выгрузки (по Form_Unload). А что делает TerminateProcess я не знаю.. И отследить изменение количества виртуальной памяти, выдаваемой под приложение, достаточно сложно, т.к. само приложение тоже её периодически просит. Поэтому я и хочу добиться нормальной выгрузки, "по-хорошему", так сказать.. :-)

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 13.05.2004 (Чт) 16:24

А, вы таки докопались до этой функции. Не хотел я ее советовать, но раз уж вы сами до нее дошли, то позволю себе процитировать кое-что, а именно MSDN, статью по этой функции.
Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed.

То есть, тут же грохайте хэндл на жертву, иначе не видать вам памяти, как своих ушей, типа. Ладно, едем дальше:
The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.

Может, действительно попробовать то, что предлагают? В конце концов, бороться с Microsoft посредством ее же API - затея, изначально обреченная на неудачу, имхо. :)

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 13.05.2004 (Чт) 16:37

Ennor, а ты не мог бы более по-русски выразиться? :-)

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

И есть ли ОНО (hwnd) у процесса вообще? (Тут не смеяться!)

P.S. Может ли тут помочь EnumWindows и EnumWindowsProc? Последней, кстати, в ApiGuide нету. Или там не то зарыто?

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

Сообщение alibek » 13.05.2004 (Чт) 16:58

EnumWindowsProc это не API, это CallBack-процедура. Т.е. ты должен эту процедуру объявить в модуле (декларацию смотри в MSDN) и при EnumWindows передать указатель на эту процедуру.

hWnd это хэндл окна и у одного процесса этих hWnd может быть куча. А может и не быть ни одного, если в приложении не имеется ни одного окна.

TerminateProcess можно юзать на здоровье, Ennor имел ввиду, что его использование не поможет тебе освободить память. А еще он имел ввиду, что грохать нужно хэндлы, т.е. если ты выделяешь область памяти GlobalAlloc, то ты сам же должен и освободить ее GlobalFree. Но это если бы ты все делал сам, а ты используешь контрол, а там фиг его знает, какие хэндлы он за собой не закрывает.
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList