2012-01-26 2 views
5

Ho una DLL di terze parti che carico in un software che non è mio e sto usando AllocConsole() per creare la finestra CLI standard di Windows in modo da avere un mezzo facile per emettere messaggi di debug.Utilizzo di STDIN con un AllocConsole()

Il mio problema è che ignora qualsiasi tipo di input. Voglio solo essere in grado di utilizzare la console che ho allocato e consentire a me di dargli qualche input.

+1

Presumo che questo sia in MS Windows, poiché 'AllocConsole' è un'API Microsoft. Ricodifica in modo appropriato. –

+1

Dice anche Windows CLI nel mio post quindi non si devono fare ipotesi. Grazie per il ritorno. – Nowayz

risposta

11

grazie a Ben Voigt, sono stato in grado di causare la console per prendere input dopo ho destinarlo facendo:

freopen("CONIN$", "r", stdin); 
freopen("CONOUT$", "w", stdout); 
freopen("CONOUT$", "w", stderr); 

Questo dirige anche lo stdout e strerr alla stessa finestra della console, nel caso in cui siano diretto da qualche altra parte per qualche motivo.

+0

Nel caso in cui aiuti chiunque, con VS2013 non ero in grado di far chiudere la console tramite FreeConsole senza "rimettere" stdout/stderr: freopen ("OUT", "w", stdout); – tmruss

2

Reindirizza anche il stdout e il stderr alla tua console?

Ho utilizzato questo codice per ottenere l'accesso all'uscita JavaVM da un'app di Windows.

if(::AllocConsole()) 
    { 
     int hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); 
     FILE *hf = ::_fdopen(hCrt, "w"); 
     *stdout = *hf; 
     ::setvbuf(stdout, NULL, _IONBF, 0); 

     hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT); 
     hf = ::_fdopen(hCrt, "w"); 
     *stderr = *hf; 
     ::setvbuf(stderr, NULL, _IONBF, 0); 
    } 

Dopo questo posso esaminare tutte stdout e stderr uscite dal VM.

+0

Ho diretto lo stdout e lo stderr sì, ma non riesco ancora a utilizzare la finestra CLI per STDIN. Quando provo a impostare lo stdin correttamente, la finestra continua a non essere digitata. – Nowayz

+0

Gli handle standard non sono associati a una console creata dopo l'avvio del programma. Se ciò fosse stato fatto prima, il resto potrebbe funzionare. –

2

Questo è il codice che funziona per me:

freopen("CONOUT$", "w", stdout); 

Probabilmente si può fare qualcosa di simile con CONIN$ e stdin (Open per la lettura, ovviamente).

+0

Grazie a questo era sulla strada giusta. – Nowayz