Привет всем. Подскажите, пожалуйста, в чем моя ошибка. Задача: перехватить вывод консоли. В качестве примера взята строка 'cmd /c dir'. В примере указано место в котором возникает ошибка ERROR_BROKEN_PIPE(0000006D). Не могу понять в чем дело... Вот основная часть: Код (Text): . . . mov [security.nlength], sizeof.SECURITY_ATTRIBUTES mov [security.lpSecutityDescriptor], NULL mov [security.pInheritHandle], TRUE invoke CreatePipe, hReadPipe, hWritePipe, security, 0 test eax, eax jz @FreeResource xor eax, eax mov [sinfo.cb], sizeof.STARTUPINFO mov eax, [hWritePipe] mov [sinfo.hStdOutput], eax mov [sinfo.hStdError], eax mov [sinfo.dwFlags], STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW mov [sinfo.wShowWindow], SW_HIDE invoke CreateProcess, NULL, pCmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, sinfo, pinfo test eax, eax jz @FreeResource invoke CloseHandle, [hWritePipe] @WiatLoop: invoke ReadFile, [hReadPipe], pReadStr, 1023, iBytesRead, NULL ; Здесь возвращается ERROR_BROKEN_PIPE(0000006D) mov eax, [iBytesRead] test eax, eax jz @WiatLoop invoke MessageBox, 0, pReadStr, NULL, MB_OK . . . Исходник тестового приложения вложен
Stardah Может просто процесс еще не успел стратовать ? CreateProcess returns without waiting for the new process to finish its initialization.
Stardah Так. раз два три Кроме того у вас возможны двойные закрытия и закрытие неоткрытых хэндлов. Вы бы их обнуляли вначале и сразу после закрытия на всякий пожарный.
Stardah Так как заработало если применить все поправки то в MessageBox выдается только Код (Text): Том в устройстве C не имеет метки. и все. Разве только эту надпись нужно было вывести? А остальное ?
Ну так вы собирайте все полученое в один буфер. Или выводите по мере получения. А в приведеном коде и должна выводиться только самая последняя инфа. Почему - спросите к топикстартера.
_sheva740 Да, конечно, MessageBox только для проверки, его вообще нет в итоговом коде, это тестовое приложение. Я удалил все ненужное для того чтобы опубликовать здесь.