Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перенаправить потоки


Автор: cthutq 12.5.2006, 16:14
подскажите пожалуйста как правильно перенаправлять потоки

например как из под своего процесса запустить cmd.exe в фоновом режиме,
отдать ему команду, и получить результат

например cmd.exe ipconfig /all

как создать процесс понятно, а вот как привязать к нему std::cin и std::cout ? 

Автор: _hunter 12.5.2006, 16:41
http://forum.vingrad.ru/index.php?showtopic=47439
http://forum.vingrad.ru/index.php?showtopic=15648
http://forum.vingrad.ru/index.php?showtopic=6609 

Автор: cthutq 12.5.2006, 22:23
честно говоря - ничего не понял 
куда какие пайпы создаются ... 

Автор: cthutq 13.5.2006, 12:00
написал
Код

/* -------------------------------------------------------------------------- */
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <vector>
/* -------------------------------------------------------------------------- */
const unsigned PIPE_SIZE = 4096;
/* -------------------------------------------------------------------------- */
int main(int argc, char* argv[])
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);

    SECURITY_ATTRIBUTES sa = {0};
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    HANDLE outRead = INVALID_HANDLE_VALUE;
    HANDLE outWrite = INVALID_HANDLE_VALUE;
    HANDLE inRead = INVALID_HANDLE_VALUE;
    HANDLE inWrite = INVALID_HANDLE_VALUE;

    CreatePipe (&outRead, &outWrite, &sa, 0);
    CreatePipe (&inRead, &inWrite, &sa, 0);
    SetHandleInformation(outRead, HANDLE_FLAG_INHERIT, 0);
    SetHandleInformation(inWrite, HANDLE_FLAG_INHERIT, 0);

    STARTUPINFO si = {0};
    PROCESS_INFORMATION pi = {0};
    si.cb = sizeof(STARTUPINFO);
    si.hStdError = outWrite;
    si.hStdOutput = outWrite;
    si.hStdInput = inRead;
    si.dwFlags = STARTF_USESTDHANDLES/* | STARTF_USESHOWWINDOW*/;
    si.wShowWindow = SW_HIDE;

    GetStartupInfo (&si);
    if (!CreateProcess( NULL, "c:\\windows\\system32\\cmd.exe",
                        NULL, NULL, FALSE, 0/*CREATE_NEW_CONSOLE*/,
                        NULL, NULL, &si, &pi))
    {
        std::cout << "Error create process" << std::endl;
        return 1;
    }

    unsigned long dwWrite = 0;
    unsigned long dwRead = 0;

    std::vector<unsigned char> buffer(4096);
    std::string cmd = "ipconfig /all";

    BOOL write = WriteFile (inWrite, &cmd[0], (DWORD)cmd.size(), &dwWrite, NULL);
    //BOOL write = WriteFile (hOut, &cmd[0], (DWORD)cmd.size(), &dwWrite, NULL);
    if (write && dwWrite){

    }

    BOOL read = ReadFile (outRead, &buffer[0], (DWORD)buffer.size(), &dwRead, NULL);
    if (read && dwRead){
        int k = 0;
    }

    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    return 0;
}



но что-то не получается отдавать команды и читать их smile 

Автор: Replicator 13.5.2006, 17:18
А ты попробуй, например, так:
Код

system('dir c:\>file.txt');

Потом читаешь файл file.txt и удаляешь его. Вот тебе и пайп. А главное, кроссплатформенный способ. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)