Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using STDIN with an AllocConsole()

I have a third-party dll that I load into software that isn't mine, and I'm using AllocConsole() to create the standard windows CLI window so I have an easy means of outputting debug messages.

My problem is though, is that it ignores any kind of input. I just want to be able to use the console I allocated and enable the ability for me to give it some input.

like image 899
Nowayz Avatar asked Jan 26 '12 15:01

Nowayz


4 Answers

Thanks to Ben Voigt, I was able to cause the console to take input after I allocated it by doing:

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

This also directs the stdout and strerr to the same console window, in case they are directed someplace else for some reason.

like image 52
Nowayz Avatar answered Nov 02 '22 05:11

Nowayz


Do you also redirect the stdoutand stderrto your console?

I used this code to get access to the JavaVM output from a Windows app.

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 );
    }

After this I can see all stdoutand stderr outputs from the VM.

like image 45
mkaes Avatar answered Nov 02 '22 07:11

mkaes


This is the code that works for me:

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

You can probably do something similar with CONIN$ and stdin (Open for read, of course).

like image 2
Ben Voigt Avatar answered Nov 02 '22 07:11

Ben Voigt


This is what I use.

    FILE *file = nullptr;
freopen_s(&file,"CONIN$", "r", stdin);
freopen_s(&file, "CONOUT$", "w", stdout);

Just hopes this helps someone.

like image 2
John M Cook Avatar answered Nov 02 '22 06:11

John M Cook