как убить процесс с cmd.exe ?
От: AlexyeNov Россия alexyenov.rpod.ru
Дата: 24.03.06 11:49
Оценка:
запускаю через CreateProcess следующее:

cmd.exe /c ping.exe localhost /t >1.txt

все прекрасно запускается, однако в определённый момент мне требуется убить cmd (поскольку ключок /t — бесконечный цикл), однако убить его не удается (пробовал через TerminateProcess).

Если писать в качестве комманд лайн просто ping.exe localhost /t >1.txt, то процесс не стартует (видимо, не работает перенаправление в файл).

Что делать?
Re: как убить процесс с cmd.exe ?
От: ekamaloff Великобритания  
Дата: 24.03.06 11:56
Оценка:
Здравствуйте, AlexyeNov, Вы писали:

AN>Что делать?


Как вариант — создавать процесс ("ping.exe localhost /t") через CreateProcess, в STARTUPINFO в hStdIn указать хендл файла для вывода ("1.txt").
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: как убить процесс с cmd.exe ?
От: AlexyeNov Россия alexyenov.rpod.ru
Дата: 24.03.06 11:57
Оценка:
Вернее, процесс то в списке процессов в task manager-е исчезает, однако окошко cmd остается и пинг продолжает отсчитываться.
вот пример кода (на BCB5) :


STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

String szCmdline = "cmd.exe /c ping.exe localhost /t >1.txt";

if( !CreateProcess( NULL, // No module name (use command line)
szCmdline.c_str(), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
ShowMessage( "CreateProcess failed");
return;
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, 10000 ); // ждем 10 сек до закрытия

TerminateProcess(pi.hProcess,0);

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
Re[2]: как убить процесс с cmd.exe ?
От: ekamaloff Великобритания  
Дата: 24.03.06 11:58
Оценка:
Здравствуйте, ekamaloff, Вы писали:

AN>>Что делать?


E>Как вариант — создавать процесс ("ping.exe localhost /t") через CreateProcess, в STARTUPINFO в hStdIn указать хендл файла для вывода ("1.txt").


Ошибка, не hStdIn, а hStdOut, а вообще вот пример:

Creating a Child Process with Redirected Input and Output
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: как убить процесс с cmd.exe ?
От: AlexyeNov Россия alexyenov.rpod.ru
Дата: 24.03.06 12:01
Оценка: :)
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, AlexyeNov, Вы писали:


AN>>Что делать?


E>Как вариант — создавать процесс ("ping.exe localhost /t") через CreateProcess, в STARTUPINFO в hStdIn указать хендл файла для вывода ("1.txt").



Спасибо
А как получить этот хендл, можно поподробнее?
Re[3]: как убить процесс с cmd.exe ?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 24.03.06 12:08
Оценка:
Здравствуйте, AlexyeNov, Вы писали:

E>>Как вариант — создавать процесс ("ping.exe localhost /t") через CreateProcess, в STARTUPINFO в hStdIn указать хендл файла для вывода ("1.txt").


AN>А как получить этот хендл, можно поподробнее?


OpenFile
Re[3]: как убить процесс с cmd.exe ?
От: ekamaloff Великобритания  
Дата: 24.03.06 12:10
Оценка:
Здравствуйте, AlexyeNov, Вы писали:

AN>Спасибо

AN>А как получить этот хендл, можно поподробнее?

Вот здесь еще один пример:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=498

См. способ 2.2. Он на Delphi, но я не знаю как его можно не понять, потому что это сплошное WinAPI.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: как убить процесс с cmd.exe ?
От: AlexyeNov Россия alexyenov.rpod.ru
Дата: 24.03.06 13:10
Оценка:
сделал так, но в файл ничего не пишется


STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcInfo;
HANDLE hOut;//, hOutDup;

ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
StartupInfo.cb = sizeof(StartupInfo);
ZeroMemory( &ProcInfo, sizeof(ProcInfo) );


// Создаем файл в который и будем переназначать StdOut
// Например, с такими настройками, вы можете их изменить под свои нужды
LPCTSTR lpFileName = "e:\\1.txt";
hOut = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hOut == INVALID_HANDLE_VALUE) return;

//Win32Check(DuplicateHandle(GetCurrentProcess(), hOut, GetCurrentProcess, &hOutDup, 0, TRUE, DUPLICATE_SAME_ACCESS));
Win32Check(SetHandleInformation (hOut, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT));



//GetStartupInfo(&StartupInfo);
StartupInfo.hStdOutput = hOut; // присваиваем рукоятку на свой файл

String szCmdline = Edit1->Text+String(" ")+Edit2->Text;

Win32Check(CreateProcess(NULL, szCmdline.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &StartupInfo, &ProcInfo));

// ждем пока наш процесс отработает
WaitForSingleObject(ProcInfo.hProcess, 5000);


TerminateProcess(ProcInfo.hProcess,0);

Win32Check(CloseHandle(ProcInfo.hProcess));

//если вы больше ничего не хотите делать с файлом, в который перенаправили StdOut, то закроем его
Win32Check(CloseHandle(hOut));
// Win32Check(CloseHandle(hOutDup));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.