2014-12-09 1 views
0

У меня есть SupportApp.EXE, который, если я запускаю вручную из окна CMD prommpt как это ::файла оператор повторно направление «>» не работает с CreateProcess() API

SupportApp.EXE -t 100 > AFile.csv 

работы perfcetly штраф & он создает файл CSV для меня.

Теперь я хочу автоматизировать то же самое внутри кода VC++. Итак, для этого я использую API CreateProcess(). Фрагмент коды ниже ::

TCHAR launcher[512]; 
    _tgetcwd(launcher, _MAX_PATH); 
    TCHAR workDir[512]; 
    _tgetcwd(workDir, _MAX_PATH); 
    _tcscat(launcher, "\\App\\SupportApp.exe"); 
    TCHAR cmdlineoption[512]; 
    _tcscpy(cmdlineoption, " -t 120 > AFile.csv"); 
LPTSTR appPath = (LPTSTR)cmdlineoption; 


    STARTUPINFO sInfo; 
    memset(&sInfo, 0, sizeof(sInfo)); 
    sInfo.cb = sizeof(sInfo); 
    sInfo.dwFlags = STARTF_USESHOWWINDOW; 
    sInfo.wShowWindow = SW_SHOWMAXIMIZED; 

    PROCESS_INFORMATION pInfo; 
    memset(&pInfo, 0, sizeof(pInfo)); 

    if (!CreateProcess(launcher, appPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, workDir, &sInfo, &pInfo)) 
{ 
... // log error 
} 
// success 

Я вижу, что CreateProcess() API завершается успешно, а также я вижу, что -t 120 варианта я даю также принимается этим «SupportApp.exe» НО перенаправление файла оператор «>» не работает с API CreateProcess().

Вместо этого выход направляется непосредственно на CMD. Но я хочу, чтобы вывод отправлялся в CSV-файл.

Может кто-нибудь, пожалуйста, помогите мне, как я могу перенаправить вывод моего «SupportApp.exe» в файл с помощью CreateProcess() API из моей VC++ код?

ОБНОВЛЕНИЕ 2:

Входы, данные рецензентов включены в настоящий & модифицированный фрагмент кода находится ниже, который принимает файл hnadle в структуре STARTUPINFO следующим образом ::

файл создается, но файл пуст & у него нет содержимого из createProcess()?

TCHAR launcher[512]; 
     _tgetcwd(launcher, _MAX_PATH); 
     TCHAR workDir[512]; 
     _tgetcwd(workDir, _MAX_PATH); 
     _tcscat(launcher, "\\App\\SupportApp.exe"); 
     TCHAR cmdlineoption[512]; 
     _tcscpy(cmdlineoption, " -t 120 > AFile.csv"); 
    LPTSTR appPath = (LPTSTR)cmdlineoption; 


     STARTUPINFO sInfo; 
     memset(&sInfo, 0, sizeof(sInfo)); 
     sInfo.cb = sizeof(sInfo); 
     sInfo.dwFlags |= STARTF_USESTDHANDLES; //newly added 
     sInfo.wShowWindow = SW_SHOWMAXIMIZED; 

     PROCESS_INFORMATION pInfo; 
     memset(&pInfo, 0, sizeof(pInfo)); 

     sInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
     sInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);   

     SECURITY_ATTRIBUTES sa; 
    ZeroMemory(&sa, sizeof(sa)); 
     sa.nLength = sizeof(sa); 
    sa.bInheritHandle = TRUE; 

HANDLE hn;

если (INVALID_HANDLE_VALUE = (кп = CreateFile (L "DoneDone.csv", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, & са, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0))!) { sInfo.hStdOutput = Нп; } если (! CreateProcess (пусковая, AppPath, NULL, NULL, FALSE, 0, NULL, Workdir, & sInfo, & pInfo)) { ... // журнал ошибки } // успех

ответ

3

Перенаправление вывода - это функция оболочки, то есть оболочка устанавливает ее перед запуском.

Вы не используете оболочку, вместо этого переходите непосредственно к ядру с просьбой начать процесс, чтобы вы не получили эту услугу.

Вам необходимо настроить необходимое перенаправление самостоятельно. Это делается в элементе STARTUPINFOhStdOutput. См. the documentation, конечно.

+0

Могу ли я попросить вас предоставить образец кода о том, как добиться этого перенаправления, используя поле STARTUPINFO hStdOutput? – codeLover

3

Это связано с тем, что операции перенаправления (а также операция с трубой) являются частью программы командной строки, а не частью вызова CreateProcess.

Однако вы можете выполнить именно то, что делает программа командной строки при перенаправлении, и установить дескрипторы файлов в структуре STARTUPINFO.

+0

Могу ли я попросить вас предоставить образец кода о том, как добиться этого перенаправления, используя поле STARTUPINFO hStdOutput? – codeLover

+1

@codeLover См. [Эту ссылку «CreateFile'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) для получения информации о том, как открыть файл. Просто присвойте возвращаемому дескрипту 'hStdOutput' структуры. Существует много примеров использования «CreateFile» и «CreateProcess» с «перенаправлением» в Интернете, если вы просто немного ищете. –

+0

Я попытался использовать CreateProcess() вместе с CreateFile() и дал РУЧКУ этого файла в «hStdOutput», поданном структурой STARTUPINFO. Но я вижу, что выход не перенаправляется на файл, который я создал с помощью CreateFile. Почему это так? – codeLover

Смежные вопросы