]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- this is a tentative checkin of the #100764 patch (by
authorFredrik Lundh <fredrik@pythonware.com>
Sat, 8 Jul 2000 18:06:41 +0000 (18:06 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sat, 8 Jul 2000 18:06:41 +0000 (18:06 +0000)
  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

index 36aa90353fd0188bc68af4b422f77a5561f22b12..0081af468bf9c992911d6a3692345365fc041da1 100644 (file)
@@ -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);
 }