Как программно завершить процесс чужого приложения? (Bornald C++ Builder 6.0)
В общем мне необходимо программно завершать работу чужого приложения (консольного), говорят что с SendMessage тут бывают глюки, поэтому надо завершить процесс этого приложения...
есть у меня код:
Код:
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
HANDLE hProcess;
//параметр TH32CS_SNAPPROCESS означает, что мы хотим узнать только информацию о процессах
bool Result = true;
bool Find = false;
//опишем структуру, в которой будет храниться эта информация
PROCESSENTRY32 *ProcEntry = new PROCESSENTRY32();
AnsiString FileName;
//Поиск запущенной программы T-Mail
Process32First(hSnapshot, ProcEntry);
FileName = ExtractFileName(StrPas(ProcEntry->szExeFile));
if(FileName == "T-MAILNT.EXE")
{
hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcEntry->th32ProcessID);
//Программа найдена
Find = true;
//Вырубаем ее
if(TerminateProcess(hProcess, 0)) //Ok
else {} //Косяк :-(
}
//Вызываемые функции - булевские. Поэтому, когда вернется false, значит, информации боьше нет. => можно использовать цикл
while(Result)
{
Result = Process32Next(hSnapshot, ProcEntry);
if(Result)
{
FileName = ExtractFileName(StrPas(ProcEntry->szExeFile));
if(FileName == "T-MAILNT.EXE")
{
hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcEntry->th32ProcessID);
//Программа найдена
Find = true;
//Вырубаем ее
if(TerminateProcess(hProcess, 0)) //Ok
else {} //Косяк :-(
break;
}
}
}
delete ProcEntry;
//выгрузим из памяти системный снимок
CloseHandle(hSnapshot);
if(!Find) //Программа не найдена :-(
Он не работает, так как автор забыл сказать какие библиотеки подключить или как объявить эти функции... Я не знаю как их объявить. Если кто-то знает как заставить этот код работать или другой способ завершить процесс, то напишите пожалуйста)
Он не работает, так как автор забыл сказать какие библиотеки подключить или как объявить эти функции... Я не знаю как их объявить. Если кто-то знает как заставить этот код работать или другой способ завершить процесс, то напишите пожалуйста)
Код приведённый выше код работает по-другому, нежели {$BCB}\Exemples\Apps\ProcView. Функции, используемые в приведённом выше коде, находятся в ToolHelp.DLL - библиотеке Microsoft, для получения сведений о системе. Для компиляции подключи заголовочный файл tlhelp32.h.
Но, в общем случае, подойдёт {$BCB}\Exemples\Apps\ProcView (присоединяюсь к мнению kot_).
Но, в общем случае, подойдёт {$BCB}\Exemples\Apps\ProcView (присоединяюсь к мнению kot_).
Тогда еще либу необходимо добавить к проекту.
Я пишу удаленный рестартер одной проги... мое приложение-сервер должно завершать ее процесс... но во какая хрень получается, когда я подключаюсь к своему приложению клиентом и из клиента даю команду завершить процесс, то приложение-сервер не завершает процесс почему-то. На приложении-сервере я сделал кнопку с тем же кодом завершения, но и при ее нажатии процесс не завершается пока подключен клиент. Как только я отключаюсь от приложения-сервера то при нажатии на ту кнопку приложение-сервер уже завершает процесс. Я так подозреваю что это какая-то система защиты или что-то в этом роде... Как обойти это? Стоит выкладывать тут мои сервер и клиент или ничего нельзя сделать?
Я пишу удаленный рестартер одной проги... мое приложение-сервер должно завершать ее процесс... но во какая хрень получается, когда я...
Можно использовать CreateRemoteThread(). Создать поток в чужом процессе и из него завершить процесс.
О_О честное слово совсем не понимаю что мне и как делать. "Создать поток в чужом процессе" и тем более как из него завершить процесс... может меня не правильно поняли...
hProcess, полученный OpenProcess(), а всё отсальное - стандартное.
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress, // =ThreadFunc
LPVOID lpParameter, // pointer to argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);
DWORD WINAPI ThreadFunc( LPVOID )
{
ExitProcess(0);
}
С помощью CreateRemoteThread можно создать в калькуляторе поток, в котором сокет будет принимать подключения от клиентов? О_О
Или есть какие-то ограничения?