From ddbc11893f40482678158e01aee63fec143b4900 Mon Sep 17 00:00:00 2001 From: Fredrik Lundh Date: Sat, 8 Jul 2000 18:06:41 +0000 Subject: - this is a tentative checkin of the #100764 patch (by Barry Scott). it appears to solve the problem on NT and 2000, but not on Windows 95. in other words, it's better than before, but not per- fect. I'll leave the patch open for now. --- PC/WinMain.c | 42 +++++++++++++++++++++++++++++++++++++----- 1 file 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 +#include +#include + #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); } -- cgit v0.12