]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utilsexc.cpp
rename ARRAYSIZE to CELLSARRAYSIZE to avoid conflict with a macro with the same name...
[wxWidgets.git] / src / msw / utilsexc.cpp
index 60fb2164e59e7d51783bc528d50c581dba58da35..5d2e0b52cb8fca4b7c19ae9c46265c304f92beba 100644 (file)
@@ -38,6 +38,7 @@
 #include "wx/process.h"
 #include "wx/thread.h"
 #include "wx/apptrait.h"
+#include "wx/evtloop.h"
 #include "wx/vector.h"
 
 
@@ -217,7 +218,7 @@ protected:
 protected:
     HANDLE m_hInput;
 
-    DECLARE_NO_COPY_CLASS(wxPipeInputStream)
+    wxDECLARE_NO_COPY_CLASS(wxPipeInputStream);
 };
 
 class wxPipeOutputStream: public wxOutputStream
@@ -233,7 +234,7 @@ protected:
 protected:
     HANDLE m_hOutput;
 
-    DECLARE_NO_COPY_CLASS(wxPipeOutputStream)
+    wxDECLARE_NO_COPY_CLASS(wxPipeOutputStream);
 };
 
 // define this to let wxexec.cpp know that we know what we're doing
@@ -899,6 +900,9 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
     {
         // may be NULL or not
         data->handler = handler;
+
+        if (handler)
+            handler->SetPid(pi.dwProcessId);
     }
 
     DWORD tid;
@@ -1004,8 +1008,19 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
             ::Sleep(50);
         }
 
-        // we must process messages or we'd never get wxWM_PROC_TERMINATED
-        traits->AlwaysYield();
+        // we must always process messages for our hidden window or we'd never
+        // get wxWM_PROC_TERMINATED and so this loop would never terminate
+        MSG msg;
+        ::PeekMessage(&msg, data->hWnd, 0, 0, PM_REMOVE);
+
+        // we may also need to process messages for all the other application
+        // windows
+        if ( !(flags & wxEXEC_NOEVENTS) )
+        {
+            wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
+            if ( loop )
+                loop->Yield();
+        }
     }
 
     if ( !(flags & wxEXEC_NODISABLE) )
@@ -1027,9 +1042,34 @@ long wxExecuteImpl(CharType **argv, int flags, wxProcess *handler)
     wxString command;
     command.reserve(1024);
 
+    wxString arg;
     for ( ;; )
     {
-        command += *argv++;
+        arg = *argv++;
+
+        bool quote;
+        if ( arg.empty() )
+        {
+            // we need to quote empty arguments, otherwise they'd just
+            // disappear
+            quote = true;
+        }
+        else // non-empty
+        {
+            // escape any quotes present in the string to avoid interfering
+            // with the command line parsing in the child process
+            arg.Replace("\"", "\\\"", true /* replace all */);
+
+            // and quote any arguments containing the spaces to prevent them from
+            // being broken down
+            quote = arg.find_first_of(" \t") != wxString::npos;
+        }
+
+        if ( quote )
+            command += '\"' + arg + '\"';
+        else
+            command += arg;
+
         if ( !*argv )
             break;