Comment redirect la sortie vers un fichier avec CreateProcess?

J’ai essayé d’utiliser CreateProcess pour exécuter une commande simple telle que hg > test.txt . J’ai essayé d’exécuter la chaîne dans son ensemble (par opposition à la séparer en un nom d’application et ses parameters). Pourquoi CreateProcess(0, "notepad.exe test.txt", ...) fonctionne-t-il mais CreateProcess(0, "hg > test.txt", ...) ne fonctionne pas?

Vous ne pouvez pas utiliser la redirection stdout dans la ligne de commande transmise à CreateProcess . Pour redirect stdout, vous devez spécifier un STARTUPINFO fichier pour la sortie dans la structure STARTUPINFO .

Vous faites également une autre erreur plus subtile. Le deuxième paramètre, lpCommandLine doit pointer vers la mémoire inscriptible, car CreateProcess remplace le tampon. Si vous utilisez la version ANSI de la fonction, vous vous en tirerez, mais pas pour la version Unicode.

La version Unicode de cette fonction, CreateProcessW , peut modifier le contenu de cette chaîne. Par conséquent, ce paramètre ne peut pas être un pointeur sur une mémoire en lecture seule (telle qu’une variable const ou une chaîne littérale). Si ce paramètre est une chaîne constante, la fonction peut provoquer une violation d’access.

Le code ci-dessous crée un processus sans console avec stdout et stderr redirigés vers le fichier spécifié.

 #include  int _tmain(int argc, _TCHAR* argv[]) { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; HANDLE h = CreateFile(_T("out.log"), FILE_APPEND_DATA, FILE_SHARE_WRITE | FILE_SHARE_READ, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); PROCESS_INFORMATION pi; STARTUPINFO si; BOOL ret = FALSE; DWORD flags = CREATE_NO_WINDOW; ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) ); ZeroMemory( &si, sizeof(STARTUPINFO) ); si.cb = sizeof(STARTUPINFO); si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = NULL; si.hStdError = h; si.hStdOutput = h; TCHAR cmd[]= TEXT("Test.exe 30"); ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi); if ( ret ) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } return -1; } 

CreateProcess () lance les processus, ce n’est pas un itnerpreter en ligne de commande. Il ne sait pas ce que “>” est et ne fera pas la redirection de stream pour vous. Vous devez ouvrir le fichier test.txt vous-même et lui transmettre le descripteur à CreateProcess dans la structure STARTUPINFO : CreateProcess STARTUPINFO

Microsoft a un exemple pour redirect la sortie standard: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx .

vous devez exécuter le processus cmd.exe avec les parameters “/ c ligne de commande”. Cela redirecta la sortie vers un fichier ou organisera un pipeline via CreateProcess.