diff options
author | marha <marha@users.sourceforge.net> | 2009-11-18 14:09:41 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-11-18 14:09:41 +0000 |
commit | cac6184d466da272f4eaf5d6dc8a072035523ebf (patch) | |
tree | 31b75a6e97f26fd90a9071c8c02455a9bb3a2d29 /libwinmain/winmain.c | |
parent | 14cb00dbbc4a78e733ffc743c0f0b5e0d4e40432 (diff) | |
download | vcxsrv-cac6184d466da272f4eaf5d6dc8a072035523ebf.tar.gz vcxsrv-cac6184d466da272f4eaf5d6dc8a072035523ebf.tar.bz2 vcxsrv-cac6184d466da272f4eaf5d6dc8a072035523ebf.zip |
Create the console when the first parameter on the command line is '-console'. printf output will then be shown.
Diffstat (limited to 'libwinmain/winmain.c')
-rw-r--r-- | libwinmain/winmain.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libwinmain/winmain.c b/libwinmain/winmain.c index 899a56ba9..7a69dac4a 100644 --- a/libwinmain/winmain.c +++ b/libwinmain/winmain.c @@ -1,5 +1,54 @@ #include <windows.h> +#include <stdio.h> +#include <fcntl.h> +#include <io.h> + +static void CreateConsole() +{ + static int ConsoleCreated=0; + va_list arglist; + if (!ConsoleCreated) + { + int hConHandle; + long lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + + FILE *fp; + const unsigned int MAX_CONSOLE_LINES = 500; + ConsoleCreated=1; + if (!AttachConsole(ATTACH_PARENT_PROCESS)) + AllocConsole(); + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); + coninfo.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); + + // redirect unbuffered STDOUT to the console + lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDIN to the console + lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "r" ); + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + *stderr = *fp; + setvbuf( stderr, NULL, _IONBF, 0 ); + + } +} + int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int argc=1; @@ -8,6 +57,12 @@ int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL char *argv[MAXNRARGS]; char *pTmp; char *pProgramName; + + if (!strncmp(lpCmdLine,"-console",8)) + { + CreateConsole(); + lpCmdLine+=9; + } GetModuleFileName(NULL,ProgramName,255); pTmp=strrchr(ProgramName,'\\'); |