Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, AlexyeNov, Вы писали:
AN>>Что делать?
E>Как вариант — создавать процесс ("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
Вернее, процесс то в списке процессов в 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 );
Здравствуйте, 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
Здравствуйте, AlexyeNov, Вы писали:
E>>Как вариант — создавать процесс ("ping.exe localhost /t") через CreateProcess, в STARTUPINFO в hStdIn указать хендл файла для вывода ("1.txt").
AN>А как получить этот хендл, можно поподробнее?
OpenFile
Здравствуйте, 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
сделал так, но в файл ничего не пишется
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));