2014-12-25 15 views
5

Mi piacerebbe avere un'applicazione Windows con il seguente comportamento:
1. se viene avviato da una finestra della riga di comando esistente (cmd.exe), scrive il suo stdout su quella console.
2. Se viene avviato facendo doppio clic sulla relativa icona, non apre una nuova console e non scrive il suo stdout da nessuna parte.Applicazione Windows che opzionalmente scrive su una console in C++?

Per ottenere solo 1, è possibile impostare l'argomento del collegamento /SUBSYSTEM su CONSOLE, ma se faccio doppio clic sull'icona dell'app, viene aperta una nuova finestra della console.
Per raggiungere 2, ho impostato lo stesso argomento su WINDOWS, ma poi se avvio l'app dalla console, il suo stdout non è diretto alla console.
Voglio che lo stesso eseguibile abbia entrambi i comportamenti.

Finora quello che ho trovato è che posso creare un eseguibile /SUBSYSTEM:WINDOWS e fare questo:

DWORD ret = AttachConsole(ATTACH_PARENT_PROCESS) 
if (ret != 0) { // succeeds only if the parent is cmd.exe 
    HANDLE outh = GetStdHandle(STD_OUTPUT_HANDLE); 
    WriteFile(outh, "Hello", 5, NULL, NULL); 
} 

Questo scrive Hello alla console se il processo è stato avviato da un altro e non fa nulla.
Ora c'è solo il problema di ottenere che il CRT prenda outh come MANIGLIA per lo stdout. Come lo posso fare?

Un altro problema con questa opzione è che il file cmd.exe non sta bloccando il processo avviato. Una volta avviato il nuovo processo, cmd.exe torna al prompt e la stringa Hello appare proprio lì al prompt. Se l'utente preme Invio sulla console, viene visualizzato un altro prompt. Qualche idea su come prevenirlo?

+0

Sede [questa risposta] (http: // StackOverflow .com/a/494000/4074081). – dewaffled

risposta

1

scoperto la risposta qui: http://dslweb.nwnexus.com/~ast/dload/guicon.htm

DWORD ret = AttachConsole(-1); 
if (ret != 0) { 
    HANDLE lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
    int hConHandle = _open_osfhandle((intptr_t)lStdHandle, 0); 
    FILE* fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
} 

E come per fare cmd.exe attesa, che non sembra possibile: http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx

+0

È legale sovrascrivere 'stdout' in questo modo? Inoltre, non dimenticare che è necessario registrare se hai una console o meno; se non lo fai, non dovresti scrivere sullo standard output. –

Problemi correlati