Хай
Вопрос по winapi
Пытаюсь из моего процесса вызвать дочерний 7zip.exe, и заархивировать файл, файл архивируется, но получить тот же результирующий текст, что и при обычном использовании 7zip не получается. т.е. я перенаправляю потоки stderr, stdout в канал, который читаю в главном процесе, но он всегда пустой, что не так?
Код:
HANDLE hServer = { NULL };
HANDLE hClient = { NULL };
// set default setting and enable inherit
SECURITY_ATTRIBUTES sa = { NULL };
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
// try to create pipe
if ((!CreatePipe(&hServer, &hClient, &sa, NULL)) ||
(hServer == INVALID_HANDLE_VALUE)||(hClient == INVALID_HANDLE_VALUE))
{
CloseHandle(hClient);
CloseHandle(hServer);
ShowError();
return;
}
// set default settings for STARTUPINFO structa and
// redirect stderr and stdout to pipe (phServer)
STARTUPINFO si = { NULL };
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdError = hServer;
si.hStdOutput = hServer;
PROCESS_INFORMATION pi = { NULL };
if (!CreateProcess(NULL,
cmdForNewProc,
NULL,
NULL,
TRUE,
ABOVE_NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi
))
{
CloseHandle(hClient);
CloseHandle(hServer);
ShowError();
return;
}
WaitForSingleObject(pi.hProcess, INFINITE); // wait until the process completes
TerminateProcess(pi.hProcess, 0); // terminate process 7zip process
DWORD dwReadedBytes = 0;
TCHAR buff[READ_PIPE_BUFF_SIZE] = { '\0' };
//OVERLAPPED overlaped = { NULL };
while (ReadFile(hClient, buff, sizeof(buff), &dwReadedBytes, NULL))
{
cout << buff;
}