diff options
-rw-r--r-- | PC/WinMain.c | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/PC/WinMain.c b/PC/WinMain.c index 36aa903..0081af4 100644 --- a/PC/WinMain.c +++ b/PC/WinMain.c @@ -1,16 +1,48 @@ /* Minimal main program -- everything is loaded from the library. */ +#define WINDOWS_LEAN_AND_MEAN #include <windows.h> +#include <fcntl.h> +#include <sys/stat.h> + #include "Python.h" extern int Py_Main(); int WINAPI WinMain( - HINSTANCE hInstance, // handle to current instance - HINSTANCE hPrevInstance, // handle to previous instance - LPSTR lpCmdLine, // pointer to command line - int nCmdShow // show state of window + HINSTANCE hInstance, /* handle to current instance */ + HINSTANCE hPrevInstance, /* handle to previous instance */ + LPSTR lpCmdLine, /* pointer to command line */ + int nCmdShow /* show state of window */ ) { - return Py_Main(__argc, __argv); + int null_file; + + /* + * make sure that the C RTL has valid file descriptors for + * stdin, stdout, stderr. Use the NUL device if necessary. + * This allows popen to work under pythonw. + * + * When pythonw.exe starts the C RTL function _ioinit is called + * first. WinMain is called later hence the need to check for + * invalid handles. + * + * Note: FILE stdin, stdout, stderr do not use the file descriptors + * setup here. They are already initialised before WinMain was called. + */ + + null_file = open("NUL", _O_RDWR); + + if (_get_osfhandle(0) == -1) + dup2(null_file, 0); + + if (_get_osfhandle(1) == -1) + dup2(null_file, 1); + + if (_get_osfhandle(2) == -1) + dup2(null_file, 2); + + close(null_file); + + return Py_Main(__argc, __argv); } |