X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3338a5bde55eabf53f0aea4eb9f01a8b45b4039d..a912e81f6409f4ae37ddb1f66d8474decd8da9aa:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index 4dcec53bde..60dc54d9e1 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/utilsexec.cpp +// Name: src/msw/utilsexc.cpp // Purpose: wxExecute implementation for MSW // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,14 +29,16 @@ #include "wx/app.h" #include "wx/intl.h" #include "wx/log.h" + #if wxUSE_STREAMS + #include "wx/stream.h" + #endif + #include "wx/module.h" #endif -#include "wx/stream.h" #include "wx/process.h" #include "wx/apptrait.h" -#include "wx/module.h" #include "wx/msw/private.h" @@ -124,7 +122,7 @@ public: DWORD dwProcessId; // pid of the process wxProcess *handler; DWORD dwExitCode; // the exit code of the process - bool state; // set to FALSE when the process finishes + bool state; // set to false when the process finishes }; class wxExecuteModule : public wxModule @@ -160,10 +158,10 @@ public: wxPipeInputStream(HANDLE hInput); virtual ~wxPipeInputStream(); - // returns TRUE if the pipe is still opened + // returns true if the pipe is still opened bool IsOpened() const { return m_hInput != INVALID_HANDLE_VALUE; } - // returns TRUE if there is any data to be read from the pipe + // returns true if there is any data to be read from the pipe virtual bool CanRead() const; protected: @@ -179,7 +177,8 @@ class wxPipeOutputStream: public wxOutputStream { public: wxPipeOutputStream(HANDLE hOutput); - virtual ~wxPipeOutputStream(); + virtual ~wxPipeOutputStream() { Close(); } + bool Close(); protected: size_t OnSysWrite(const void *buffer, size_t len); @@ -211,7 +210,7 @@ public: // default ctor doesn't do anything wxPipe() { m_handles[Read] = m_handles[Write] = INVALID_HANDLE_VALUE; } - // create the pipe, return TRUE if ok, FALSE on error + // create the pipe, return true if ok, false on error bool Create() { // default secutiry attributes @@ -225,13 +224,13 @@ public: { wxLogSysError(_("Failed to create an anonymous pipe")); - return FALSE; + return false; } - return TRUE; + return true; } - // return TRUE if we were created successfully + // return true if we were created successfully bool IsOk() const { return m_handles[Read] != INVALID_HANDLE_VALUE; } // return the descriptor for one of the pipe ends @@ -362,7 +361,7 @@ wxPipeInputStream::~wxPipeInputStream() bool wxPipeInputStream::CanRead() const { if ( !IsOpened() ) - return FALSE; + return false; DWORD nAvailable; @@ -384,7 +383,7 @@ bool wxPipeInputStream::CanRead() const wxLogLastError(_T("PeekNamedPipe")); } - // don't try to continue reading from a pipe if an error occured or if + // don't try to continue reading from a pipe if an error occurred or if // it had been closed ::CloseHandle(m_hInput); @@ -416,7 +415,7 @@ size_t wxPipeInputStream::OnSysRead(void *buffer, size_t len) : wxSTREAM_READ_ERROR; } - // bytesRead is set to 0, as desired, if an error occured + // bytesRead is set to 0, as desired, if an error occurred return bytesRead; } @@ -444,11 +443,12 @@ wxPipeOutputStream::wxPipeOutputStream(HANDLE hOutput) } } -wxPipeOutputStream::~wxPipeOutputStream() +bool wxPipeOutputStream::Close() { - ::CloseHandle(m_hOutput); + return ::CloseHandle(m_hOutput) != 0; } + size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len) { m_lasterror = wxSTREAM_NO_ERROR; @@ -485,19 +485,19 @@ size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len) #if wxUSE_IPC // connect to the given server via DDE and ask it to execute the command -static bool wxExecuteDDE(const wxString& ddeServer, - const wxString& ddeTopic, - const wxString& ddeCommand) +bool +wxExecuteDDE(const wxString& ddeServer, + const wxString& ddeTopic, + const wxString& ddeCommand) { bool ok wxDUMMY_INITIALIZE(false); wxDDEClient client; - wxConnectionBase *conn = client.MakeConnection(wxEmptyString, - ddeServer, - ddeTopic); + wxConnectionBase * + conn = client.MakeConnection(wxEmptyString, ddeServer, ddeTopic); if ( !conn ) { - ok = FALSE; + ok = false; } else // connected to DDE server { @@ -529,7 +529,7 @@ static bool wxExecuteDDE(const wxString& ddeServer, long wxExecute(const wxString& cmd, int flags, wxProcess *handler) { - wxCHECK_MSG( !!cmd, 0, wxT("empty command in wxExecute") ); + wxCHECK_MSG( !cmd.empty(), 0, wxT("empty command in wxExecute") ); #if wxUSE_THREADS // for many reasons, the code below breaks down if it's called from another @@ -708,23 +708,37 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) PROCESS_INFORMATION pi; DWORD dwFlags = CREATE_SUSPENDED; + #ifndef __WXWINCE__ dwFlags |= CREATE_DEFAULT_ERROR_MODE ; +#else + // we are assuming commands without spaces for now + wxString moduleName = command.BeforeFirst(wxT(' ')); + wxString arguments = command.AfterFirst(wxT(' ')); #endif bool ok = ::CreateProcess ( - NULL, // application name (use only cmd line) + // WinCE requires appname to be non null + // Win32 allows for null +#ifdef __WXWINCE__ + (wxChar *) + moduleName.wx_str(),// application name + (wxChar *) + arguments.wx_str(), // arguments +#else + NULL, // application name (use only cmd line) (wxChar *) - command.c_str(), // full command line - NULL, // security attributes: defaults for both - NULL, // the process and its main thread - redirect, // inherit handles if we use pipes - dwFlags, // process creation flags - NULL, // environment (use the same) - NULL, // current directory (use the same) - &si, // startup info (unused here) - &pi // process info + command.wx_str(), // full command line +#endif + NULL, // security attributes: defaults for both + NULL, // the process and its main thread + redirect, // inherit handles if we use pipes + dwFlags, // process creation flags + NULL, // environment (use the same) + NULL, // current directory (use the same) + &si, // startup info (unused here) + &pi // process info ) != 0; #if wxUSE_STREAMS && !defined(__WXWINCE__) @@ -862,7 +876,7 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) case WAIT_TIMEOUT: wxLogDebug(_T("Timeout too small in WaitForInputIdle")); - ok = FALSE; + ok = false; break; case 0: @@ -889,8 +903,12 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; wxCHECK_MSG( traits, -1, _T("no wxAppTraits in wxExecute()?") ); - // disable all app windows while waiting for the child process to finish - void *cookie = traits->BeforeChildWaitLoop(); + void *cookie = NULL; + if ( !(flags & wxEXEC_NODISABLE) ) + { + // disable all app windows while waiting for the child process to finish + cookie = traits->BeforeChildWaitLoop(); + } // wait until the child process terminates while ( data->state ) @@ -908,7 +926,11 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) traits->AlwaysYield(); } - traits->AfterChildWaitLoop(cookie); + if ( !(flags & wxEXEC_NODISABLE) ) + { + // reenable disabled windows back + traits->AfterChildWaitLoop(cookie); + } DWORD dwExitCode = data->dwExitCode; delete data; @@ -932,4 +954,3 @@ long wxExecute(wxChar **argv, int flags, wxProcess *handler) return wxExecute(command, flags, handler); } -