- 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.
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);
 }