Как убить процесс? Как убить процесс зная имя ехе-файла?
#1
Posted 10 September 2005 - 01:10 PM
Задача - завершить выполнение программы под Win95. Знаю имя ехе-файла. Он постоянно читает данные из COM-порта и пишет их в файл на диске. Необходимо получить доступ к этому файлу (переместить его в другое место). Как в Win95 можно завершить выполнение этой программы?
Помогите пожалуйста, только с комментами плз, я начинающий...
Можно воспользоваться чем либо кроме API? По этому вопросу нашел материал в Win32 SDK, но там всё так сложно для понимания, что не вижу иного выхода как только обратиться за помощью к Вам...
Есть возможность убить процесс в Win3.11?
Отредактировано: Bah в сегодня, 13:06
#2
Posted 14 September 2005 - 05:24 PM
Кстати, эту книгу порекомендую и профи и начинающим. После её прочтения устройство Винды становиться горазда понятнее
#3
Posted 14 September 2005 - 05:49 PM
Все ошибки в тексте преднамеренны. Они заставляют задуматься о смысле бытия.
#4
Posted 14 September 2005 - 06:02 PM
ctrl+alt+del конечно мощная штука, но по ряду причин мне не подходит. Задачу надо реализовать программно. Объясню суть.
Существует ехе-файл (назовем его nnn.exe), который считывает данные из СОМ-порта и записывает их в файл на диске. Раз в сутки (скорее всего в 00.00 часов) необходимо забирать этот файл. Если вышеупомянутый nnn.exe не обнаруживает файл он создает его заново. Программно переместить этот файл не получиться, т.к. он занят занят nnn.exe. Каждую ночь приходить на работу и выполнять операцию ctrl+alt+del что-то в лом
Как реализовать программное закрытие nnn.exe?
Реализовать надо на WIN3.11 или WIN95 ... Помогите!!!
#5
Posted 15 September 2005 - 06:04 PM
Невозможно, потому что принудительно завершать приложения нельзя, так как для чистого завершения работы ему может понадобиться выполнитиь кучу специфических действий (закрыть сокеты, деинициализировать D3D, отчитаться в логах, удалить временные файлы итп), и только ему известно, какие именно. Поэтому ему можно только предложить завершить работу, а не заставить. И при этом приложение имеет полное право отказаться без объяснения причин.
А "чисто" - потому что "нечисто" можно всё. Просто скажи ему TerminateProcess(), и у него нет шансов. Однако, это крайний случай. К применению всячески не рекомендуется.
Это была философия. Чтобы прояснить природу сложностей, с которыми ты столкнулся. Для конкретного ответа мало информации. Вот несколько вопросов:
1. имеет ли это приложение окно, лучше всего "главное окно"?
2. имеет ли оно пользовательский интерфейс вообще, консольный или гуйный?
3. нельзя ли просто открыть файл в режиме "только чтение" и потихонечку его покопировать с запоминанием текущего размера, чтоб в следующий раз инкрементильно вычитать только новые данные или же оно держит файл монопольно? (в этом случае не надо перемещать файл и тем более выгружать приложение)?
4. нельзя ли другими способами форсировать его выгрузку, например, вдудолив в COM магическую комбинацию байтов, из-за чего оно скажет stack overflow и само снимется?
Пока хватит. Думаю, ещё поговорим.
#6
Posted 15 September 2005 - 06:36 PM
1. Окно имеется
2. Интерфейс: "свернуть", "развернуть", "закрыть"
3. В режиме "только чтение" открывать файл не подходит: надо чтобы он создавался заново т.к. при создании екзешник записывает в него нужную заголовочную информацию.
4. !!!do not understand!!!
Про СОМ можно поподробнее? И про магическую комбинацию байтов тоже...
#7
Posted 16 September 2005 - 04:42 PM
1. Раз есть окно, то проще всего послать ему WM_CLOSE. Если при этом начнуться дополнительные вопросы по типу "Вы уверены? OK/Cancel", то и на них поотвечать как-нибудь SendMessage(hDlg, WM_COMMAND, IDOK, 0). Таким образом, програмно имитируются действия пользователя.
2. Если не прокатит, можно попробовать спуститься на более низкий уровень - SendInput(), keybd_event() и mouse_event().
3. тады отпадает.
#8
Posted 16 September 2005 - 05:45 PM
[/CODE]
#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include <tlhelp32.h>
#include <dstring.h>
#include "Unit1.h"
//-------------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------------------
//по имени ехе узнаем пид процесса
DWORD GetProcessByExeName(AnsiString ExeN)
{
DWORD id;
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
AnsiString temp="";
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32)) temp = pe32.szExeFile;
pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
temp = pe32.szExeFile;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (temp == ExeN)
{
id = pe32.th32ProcessID;
CloseHandle(hProcessSnap);
return id;
}
}
CloseHandle(hProcessSnap);
MessageBox(NULL, "Процесс не найден!", "!", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
return false;
}
//-------------------------------------------------------------------------------
//зная пид убиваем процесс
bool KillProcByPid(DWORD id)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, id);
if(INVALID_HANDLE_VALUE != hProcess)
{
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
//-------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString ExeName; //имя ехе
DWORD Pid = 0; // PID процесса
ExeName = Edit1->Text;
Pid = GetProcessByExeName(ExeName);
Edit2->Text = (Pid);
KillProcByPid(Pid);
}
Как оптимизировать сие безобразие??? Писано под Builder 6....
#9
Posted 16 September 2005 - 06:31 PM
1. Compiler -> Release
2. Packages -> снял галочку Build with runtime packages
3. Linker -> снял галочку Use dinamic RTL
В итоге размер ехе увеличился с 30кб до 475кб. Под 98 винду вроде нормально запускается, а под 95 пишет "Отсутствует компонент OLEAUT32.DLL:173"
Чё делать надо???
#10
Posted 19 September 2005 - 08:44 PM
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32)) temp = pe32.szExeFile;
pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
if(Process32First(hProcessSnap,&pe32))
do
{
temp = pe32.szExeFile;
if (temp == ExeN)
return CloseHandle(hProcessSnap),
pe32.th32ProcessID;
} while(Process32Next(hProcessSnap,&pe32));
if(GetLastError()!=ERROR_NO_MORE_FILES)
/* тут обрабатываем ошибки */
#12
Posted 20 April 2007 - 06:15 PM
Bah дружище, лучше поздно чем никогда!
Выкладываю своё, рабочее решение обсуждаемого вопроса:
bool kill_p(char *str) {
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 ps;
ps.dwSize = sizeof(ps);
Process32First(hSnap, &ps);
for (int i=0; i<100; i++) { // - число сканируемых процессов
Process32Next(hSnap, &ps);
if ((AnsiString(ps.szExeFile))==str) {
int id=ps.th32ProcessID;
HANDLE ps = OpenProcess(1, false, id);
TerminateProcess(ps, 0);
CloseHandle(hSnap);
return true;
}
}
Просто и удобно, хотя в API функции конечно отстой, как и сам Microsoft.
#13
Posted 20 April 2007 - 08:56 PM
- Обработка ошибок отсутствует в принципе - добро пожаловать в окошко приглашения отправить отчёт об ошибке в MicroSoft. Этого уже достаточно... Однако, продолжим.
- Количество процессов ограниченно. Зачем?
- Вместо определённых в SDK констант и типов используются их числовые и C++ эквиваленты. Тебе нравится переписывать свои приложения для новых версий операционных систем?
- Код неоптимален. По крайнем мере в двух местах. Ищи сам.
- Функция написана не только небезопасно - об этом говорится в 1. - но она к тому же никак не отчитывается об успехе/неуспехе. По большому счёту возвращаемое значение вообще не определено.
- Используется метод завершения (TerminateProcess()), крайне не рекомендованный к применению.
- Имеет место утечка ресурсов. В двух местах.
- Параметр у функции без причины неконстантен.
- Функция неоптимальна под WinNT-based ОСами, потому что ориентирована только на ANSI-приложения. Более того, в UNICODE-приложениях она будет работать неправильно. Вернее, вообще не будет работать.
- В реализации функции есть ошибка. Я на неё и оригинальному автору указывал.
#14
Posted 23 April 2007 - 10:17 AM
to litelite
если микрософт отстой, то что тогда не отстой??? на сегодняшний день нет крупнее конторы, которая занималась бы развитием такого же широкого круга инф технологий. но всегда находятся начитавшиеся умники, которые даже проанализировать свои же знания не могут.
#15
Posted 31 July 2007 - 10:58 PM
пешите отвечю:) BILBIL@YANDEX.RU

Help










