X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec8c565dafa9f09e3812edb1ddb6f78fb4f4b225..df4131711384a17b827ab4b964dbabc6af2aa5da:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index c71ce01c55..ae26542774 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -33,7 +33,9 @@ #include "wx/app.h" #include "wx/intl.h" #include "wx/log.h" - #include "wx/frame.h" + #if wxUSE_GUI // See 'dirty hack' below. + #include "wx/frame.h" + #endif #endif #ifdef __WIN32__ @@ -137,7 +139,7 @@ public: bool IsOpened() const { return m_hInput != INVALID_HANDLE_VALUE; } // returns TRUE if there is any data to be read from the pipe - bool IsAvailable() const; + virtual bool CanRead() const; protected: size_t OnSysRead(void *buffer, size_t len); @@ -260,7 +262,7 @@ private: // thread function for the thread monitoring the process termination static DWORD __stdcall wxExecuteThread(void *arg) { - wxExecuteData *data = (wxExecuteData*)arg; + wxExecuteData * const data = (wxExecuteData *)arg; if ( ::WaitForSingleObject(data->hProcess, INFINITE) != WAIT_OBJECT_0 ) { @@ -291,7 +293,7 @@ LRESULT APIENTRY _EXPORT wxExecuteWindowCbk(HWND hWnd, UINT message, { DestroyWindow(hWnd); // we don't need it any more - wxExecuteData *data = (wxExecuteData *)lParam; + wxExecuteData * const data = (wxExecuteData *)lParam; if ( data->handler ) { data->handler->OnTerminate((int)data->dwProcessId, @@ -314,7 +316,7 @@ LRESULT APIENTRY _EXPORT wxExecuteWindowCbk(HWND hWnd, UINT message, } else { - return DefWindowProc(hWnd, message, wParam, lParam); + return ::DefWindowProc(hWnd, message, wParam, lParam); } } @@ -339,12 +341,12 @@ wxPipeInputStream::~wxPipeInputStream() ::CloseHandle(m_hInput); } -bool wxPipeInputStream::IsAvailable() const +bool wxPipeInputStream::CanRead() const { // FIXME #ifdef __WXWINE__ return FALSE; -#else +#else // !Wine if ( !IsOpened() ) return FALSE; @@ -372,37 +374,36 @@ bool wxPipeInputStream::IsAvailable() const // it had been closed ::CloseHandle(m_hInput); - wxConstCast(this, wxPipeInputStream)->m_hInput = INVALID_HANDLE_VALUE; + wxPipeInputStream *self = wxConstCast(this, wxPipeInputStream); - return FALSE; + self->m_hInput = INVALID_HANDLE_VALUE; + self->m_lasterror = wxSTREAM_EOF; + + nAvailable = 0; } return nAvailable != 0; -#endif +#endif // Wine/!Wine } size_t wxPipeInputStream::OnSysRead(void *buffer, size_t len) { - // reading from a pipe may block if there is no more data, always check for - // EOF first - if ( !IsAvailable() ) + if ( !IsOpened() ) { m_lasterror = wxSTREAM_EOF; return 0; } - m_lasterror = wxSTREAM_NOERROR; - DWORD bytesRead; if ( !::ReadFile(m_hInput, buffer, len, &bytesRead, NULL) ) { - if ( ::GetLastError() == ERROR_BROKEN_PIPE ) - m_lasterror = wxSTREAM_EOF; - else - m_lasterror = wxSTREAM_READ_ERROR; + m_lasterror = ::GetLastError() == ERROR_BROKEN_PIPE + ? wxSTREAM_EOF + : wxSTREAM_READ_ERROR; } + // bytesRead is set to 0, as desired, if an error occured return bytesRead; } @@ -422,18 +423,17 @@ wxPipeOutputStream::~wxPipeOutputStream() size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len) { - DWORD bytesRead; + DWORD bytesWritten; - m_lasterror = wxSTREAM_NOERROR; - if ( !::WriteFile(m_hOutput, buffer, len, &bytesRead, NULL) ) + m_lasterror = wxSTREAM_NO_ERROR; + if ( !::WriteFile(m_hOutput, buffer, len, &bytesWritten, NULL) ) { - if ( ::GetLastError() == ERROR_BROKEN_PIPE ) - m_lasterror = wxSTREAM_EOF; - else - m_lasterror = wxSTREAM_READ_ERROR; + m_lasterror = ::GetLastError() == ERROR_BROKEN_PIPE + ? wxSTREAM_EOF + : wxSTREAM_WRITE_ERROR; } - return bytesRead; + return bytesWritten; } #endif // wxUSE_STREAMS @@ -451,7 +451,7 @@ static bool wxExecuteDDE(const wxString& ddeServer, const wxString& ddeTopic, const wxString& ddeCommand) { - bool ok; + bool ok = FALSE; wxDDEClient client; wxConnectionBase *conn = client.MakeConnection(_T(""), @@ -468,17 +468,17 @@ static bool wxExecuteDDE(const wxString& ddeServer, // important ones - like IE and other MS stuff - use // XTYP_REQUEST! // - // so we try it first and then the other one if it + // so we try one first and then the other one if it // failed { wxLogNull noErrors; - ok = conn->Request(ddeCommand) != NULL; + ok = conn->Execute(ddeCommand); } if ( !ok ) { - // now try execute - but show the errors - ok = conn->Execute(ddeCommand); + // now try request - but show the errors + ok = conn->Request(ddeCommand) != NULL; } } @@ -897,8 +897,15 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) // real async IO which we don't have for the moment ::Sleep(50); +#if wxUSE_GUI // repaint the GUI wxYield(); +#else // !GUI + // dispatch the messages to the hidden window so that it could + // process the wxWM_PROC_TERMINATED notification + MSG msg; + ::PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE); +#endif // GUI/!GUI } #if wxUSE_GUI