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?
Sede [questa risposta] (http: // StackOverflow .com/a/494000/4074081). – dewaffled