2011-09-25 13 views
5

Volevo chiamare _popen per ottenere i risultati da un file eseguibile ma si stava disattivando.Piping di un programma che utilizza WriteConsole

Ho cercato nel debugger e ho scoperto che il programma utilizza Kernel32.WriteConsoleW per scrivere una stringa unicode sulla console, invece di usare stdout.

Come si acquisisce?

+0

Qualcuno sa se posso reindirizzare il manico del processo figlio e chiamare ReadConsole su di esso? – user202987

risposta

0

Dovresti essere in grado di reindirizzare l'output di un processo figlio.

Dai un'occhiata alla Creating a Child Process with Redirected Input and Output

Inoltre l'applicazione potrebbe utilizzare STD_ERROR_HANDLE invece di STD_OUTPUT_HANDLE.

+1

Lavorare sulla soluzione più compromessa, mai trovata in base a questo collegamento. Grazie. Fondamentalmente sto facendo sistema ("cls") quindi usando CreateProcess dando al processo figlio lo stdout del genitore, quindi usando ReadConsoleOutputW e ricostruendo il risultato da quello. – user202987

1

La soluzione di overkill: intercetta le chiamate a WriteConsoleW agganciando l'applicazione all'avvio. Probabilmente non è quello che stai cercando, e sono sicuro che c'è un modo più semplice. Ma funzionerà sicuramente :)

3

Qualsiasi output generato con WriteConsole non verrà scritto nella pipe di reindirizzamento. Se a WriteConsole viene assegnato un handle a una pipe, a un file oa qualcosa di diverso da una console, fallirà con ERROR_INVALID_HANDLE (6).

Da High-Level Console Input and Output Functions su MSDN:

ReadConsole e WriteConsole possono essere utilizzati solo con maniglie della console; ReadFile e WriteFile possono essere utilizzati con altri handle (come file o pipe). ReadConsole e WriteConsole non riescono se utilizzato con un handle standard che è stato reindirizzato e non è più un handle di console.

Problemi correlati