summaryrefslogtreecommitdiffstats
path: root/PC
diff options
context:
space:
mode:
authorFredrik Lundh <fredrik@pythonware.com>2000-07-08 18:06:41 (GMT)
committerFredrik Lundh <fredrik@pythonware.com>2000-07-08 18:06:41 (GMT)
commitddbc11893f40482678158e01aee63fec143b4900 (patch)
treeb511a51937483184f8f6d0a228faecde4726e8f3 /PC
parent2a1e060619b10062ce7ef2b826b2da940096f7a5 (diff)
downloadcpython-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.
Diffstat (limited to 'PC')
-rw-r--r--PC/WinMain.c42
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);
}