diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2000-07-08 18:06:41 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2000-07-08 18:06:41 (GMT) |
commit | ddbc11893f40482678158e01aee63fec143b4900 (patch) | |
tree | b511a51937483184f8f6d0a228faecde4726e8f3 | |
parent | 2a1e060619b10062ce7ef2b826b2da940096f7a5 (diff) | |
download | cpython-ddbc11893f40482678158e01aee63fec143b4900.zip cpython-ddbc11893f40482678158e01aee63fec143b4900.tar.gz cpython-ddbc11893f40482678158e01aee63fec143b4900.tar.bz2 |
- 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.
-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); } |