Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2013, 17:56   #1
batnik.com
Пользователь
 
Аватар для batnik.com
 
Регистрация: 10.10.2012
Сообщений: 14
По умолчанию Запуск taskkill через CreateProcess(не работает)

Привет всем!
Пишу функцию которая завершает процесс с помощью taskkill.exe и ждет до окончания завершения.
Вот ее код:
Код:
void KillProc(AnsiString proc_name) {
Form1->Timer1->Enabled=false;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
int res = CreateProcess(AnsiString(ExtractFilePath(getenv("COMSPEC")) + "\\taskkill.exe").c_str(), AnsiString("/f /im "+proc_name).c_str(),NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (res) {
 while (WAIT_TIMEOUT == WaitForSingleObject(pi.hProcess, 300)) {

}
 //Form1->Timer1->Enabled=true;
// GetExitCodeProcess(pi.hProcess, &res);
 CloseHandle(pi.hProcess);
  }
}
При запуске программы черное окно тасккилла вылетает но нужный процесс не завершается. Когда набираю в cmd "taskkill /f /im тот_же_самый_процесс" все работает.

В чем дело?

Заранее всем большое спасибо.
batnik.com вне форума Ответить с цитированием
Старый 06.07.2013, 20:57   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Дело в том, что это примерно как "сделать маленькую отвёртку при помощи большой отвёртки и напильника". Ждать завершения taskkill не имеет смысла, т.к. он может написать в консоль "отказано в доступе", и завершиться.

Вместо этого нужно пройтись по списку процессов при помощи Process32First/Process32Next и прибить нужные через OpenProcess/TerminateProcess, убедиться, что процесс завершился через тот же WaitForSingleObject. На делфи это выглядит примерно так:

Код:
program Terminate;

{$AppType CONSOLE}

uses
    Windows, Tlhelp32, SysUtils;

function GetProcessId(hProcess: THandle): DWORD; stdcall external 'kernel32.dll';

procedure KillByName(process_name: string);
var
    ContinueLoop: bool;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
    ProcessHandle, ProcessID, result: dword;
begin
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    while Integer(ContinueLoop) <> 0 do
    begin
        if UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(process_name) then
        begin
            ProcessHandle := OpenProcess(PROCESS_TERMINATE + PROCESS_QUERY_INFORMATION + SYNCHRONIZE, bool(0), FProcessEntry32.th32ProcessID);
            ProcessID := GetProcessId(ProcessHandle);            
            TerminateProcess(ProcessHandle, 0);
            result := WaitForSingleObject(ProcessHandle, 5000);
            if result = WAIT_OBJECT_0 then
                writeln('Terminated process ', ProcessID)
            else if result = WAIT_TIMEOUT then
                writeln('Failed to terminate process ', ProcessID, ' in 5 seconds')
            else
                writeln('Failed to open/terminate process');
        end;
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
end;

begin
    KillByName('chrome.exe');
end.
пыщь

Последний раз редактировалось JTG; 06.07.2013 в 21:04.
JTG вне форума Ответить с цитированием
Старый 19.07.2013, 12:18   #3
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию

Цитата:
Пишу функцию которая завершает процесс с помощью taskkill.exe
Ну ты прям феномен!
Stertor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Проблема]Изм. заголовка запускаемого exe(GUI программа), через createProcess Человек_Борща Общие вопросы Delphi 0 28.02.2011 22:22
CreateProcess, правильный запуск bat and exe.. m.a.x.i.m Win Api 1 23.09.2010 09:04
Через CreateProcess запустить программу в свёрнутом состоянии. Человек_Борща Общие вопросы Delphi 9 30.08.2010 15:22
CreateProcess не работает. Пепел Феникса Общие вопросы Delphi 4 16.07.2010 03:18
Не работает запуск на выполнение (F9) DeN1308 Общие вопросы Delphi 9 30.10.2007 17:34