C ++ CreateProcess перенаправить только вывод - PullRequest
0 голосов
/ 23 сентября 2018

Пожалуйста, обратите внимание на слово «только».Существует много примеров перенаправления ввода и вывода, и я смог это сделать, но когда я перенаправляю только вывод, я не получаю ожидаемого поведения.Я много искал, но не мог найти что-то похожее.Я уверен, что это выполнимо, потому что я могу сделать это в C #.Используя этот код в C #:

Process process;
    public Form1()
    {
        InitializeComponent();

        process = new Process()
                      {
                          StartInfo = new ProcessStartInfo("C:\\Windows\\System32\\cmd.exe")
                           {
                           UseShellExecute = false,
                           RedirectStandardOutput = true,
                           RedirectStandardError = true,
                           CreateNoWindow = false,
                           }
                      };
        process.OutputDataReceived += Process_OutputDataReceived;
        process.ErrorDataReceived +=Process_OutputErrorReceived;
        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        bool retval = AttachConsole(process.Id);
        while(true);

    }

    private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {

    }

, программа ведет себя так, как я ожидаю.Он создает и очищает командное окно, в котором я могу набирать команды и получать их вывод в Process_OutputDataReceived.Попытка сделать то же самое в C ++ с помощью этого кода:

int main()
{
SECURITY_ATTRIBUTES attributes;
attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
attributes.bInheritHandle = TRUE;
attributes.lpSecurityDescriptor = NULL;

HANDLE m_stdOutRead, m_stdOutWrite, m_stdErrorRead, m_stdErrorWrite;

if (!CreatePipe(&m_stdOutRead, &m_stdOutWrite, &attributes, 0) ||
    !CreatePipe(&m_stdErrorRead, &m_stdErrorWrite, &attributes, 0)) {
    return -1;
}

SetHandleInformation(m_stdOutRead, HANDLE_FLAG_INHERIT, 0);
SetHandleInformation(m_stdErrorRead, HANDLE_FLAG_INHERIT, 0);

wchar_t cmdPath[MAX_PATH];
::GetEnvironmentVariable(L"COMSPEC", cmdPath, MAX_PATH);

STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
si.hStdOutput = m_stdOutWrite;
si.hStdError = m_stdErrorWrite;

PROCESS_INFORMATION m_processInfo;
BOOL retval = ::CreateProcess(cmdPath,
    nullptr,
    NULL,
    NULL,
    TRUE,
    0,
    NULL,
    NULL,
    &si,
    &m_processInfo);

while(true);
return 0;
}

не делает то, что я ожидаю.Вывод действительно перенаправлен, и я знаю, что, поскольку я получаю «Microsoft Windows [версия blablabla» вывода консоли, когда читаю канал, но окно командной консоли вновь созданного процесса сразу закрывается, и я все еще не могу набирать команды вэто и получить вывод.Процесс, кажется, все еще работает, но где окно?Я предполагаю, что это происходит потому, что окно командной консоли вообще не имеет обработчика ввода (вместо использования его собственного).Но это только предположение.Любой совет будет оценен.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...