2012-01-26 14 views
5

Mam dll innej firmy, które ładuję do oprogramowania, które nie jest moje, i używam AllocConsole(), aby utworzyć standardowe okno Windows CLI, więc mam łatwy sposób wyprowadzanie komunikatów debugowania.Używanie STDIN z AllocConsole()

Mój problem polega jednak na tym, że ignoruje wszelkiego rodzaju dane wejściowe. Po prostu chcę mieć możliwość korzystania z przydzielonej konsoli i umożliwić mi wprowadzenie pewnych danych wejściowych.

+1

Zakładam, że jest to na MS Windows, ponieważ 'AllocConsole' to Microsoft API. Ponowne dobieranie odpowiednio. –

+1

To również mówi o Windows CLI w moim poście, więc nie ma żadnych założeń. Dziękuję za retag. – Nowayz

Odpowiedz

11

Dzięki Ben Voigt, byłem w stanie spowodować, że konsola do podjęcia wejście po I przydzielono go wykonując:

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

ten kieruje również stdout i strerr do tego samego okna konsoli, w przypadku gdy są kierowane gdzie indziej z jakiegoś powodu.

+0

Na wypadek, gdyby pomogło to komuś, przy VS2013 nie mogłem uzyskać zamknięcia konsoli przez FreeConsole bez "przywracania" stdout/stderr: freopen ("OUT", "w", stdout); – tmruss

2

Czy przekierowujesz także stdout i stderr do konsoli?

Użyłem tego kodu, aby uzyskać dostęp do wyjścia JavaVM z aplikacji 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); 
    } 

Następnie można znaleźć wszystkie stdout i stderr wyjść z VM.

+0

Skierowałem stdout i stderr tak, ale nadal nie mogę używać okna CLI dla STDIN. Kiedy próbuję poprawnie ustawić stdin, okno nadal nie chce być wpisane. – Nowayz

+0

Standardowe uchwyty nie są powiązane z konsolą utworzoną po uruchomieniu programu. Jeśli to zrobiono najpierw, reszta może się sprawdzić. –

2

Jest to kod, który działa dla mnie:

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

Prawdopodobnie można zrobić coś podobnego z CONIN$ i stdin (otwarty do odczytu, oczywiście).

+0

Dzięki temu dokonano właściwego wyboru. – Nowayz