X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4676948b6814c97b93c431a8cbcd8c0352c87ba9..65a1f3509bd761f4e6a4873f80889ebf84bc1e4b:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index e1e0d9dc98..b969c899bf 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation #endif @@ -35,13 +35,13 @@ #include "wx/log.h" #endif -#ifdef __WIN32__ - #include "wx/stream.h" - #include "wx/process.h" -#endif +#include "wx/stream.h" +#include "wx/process.h" #include "wx/apptrait.h" +#include "wx/module.h" + #include "wx/msw/private.h" #include @@ -58,14 +58,14 @@ #include #endif -#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) -#ifndef __UNIX__ - #include -#endif +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + #ifndef __UNIX__ + #include + #endif -#ifndef __GNUWIN32__ -#include -#endif + #ifndef __GNUWIN32__ + #include + #endif #endif #include @@ -82,6 +82,10 @@ #include "wx/dde.h" // for WX_DDE hack in wxExecute #endif // wxUSE_IPC +// implemented in utils.cpp +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc); + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -96,6 +100,7 @@ // we need to create a hidden window to receive the process termination // notifications and for this we need a (Win) class name for it which we will // register the first time it's needed +static const wxChar *wxMSWEXEC_WNDCLASSNAME = wxT("_wxExecute_Internal_Class"); static const wxChar *gs_classForHiddenWindow = NULL; // ---------------------------------------------------------------------------- @@ -124,7 +129,28 @@ public: bool state; // set to FALSE when the process finishes }; -#if defined(__WIN32__) && wxUSE_STREAMS && !defined(__WXWINCE__) +class wxExecuteModule : public wxModule +{ +public: + virtual bool OnInit() { return true; } + virtual void OnExit() + { + if ( *gs_classForHiddenWindow ) + { + if ( !::UnregisterClass(wxMSWEXEC_WNDCLASSNAME, wxGetInstance()) ) + { + wxLogLastError(_T("UnregisterClass(wxExecClass)")); + } + + gs_classForHiddenWindow = NULL; + } + } + +private: + DECLARE_DYNAMIC_CLASS(wxExecuteModule) +}; + +#if wxUSE_STREAMS && !defined(__WXWINCE__) // ---------------------------------------------------------------------------- // wxPipeStreams @@ -258,8 +284,6 @@ private: // implementation // ============================================================================ -#ifdef __WIN32__ - // ---------------------------------------------------------------------------- // process termination detecting support // ---------------------------------------------------------------------------- @@ -438,8 +462,6 @@ size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len) #endif // wxUSE_STREAMS -#endif // Win32 - // ============================================================================ // wxExecute functions family // ============================================================================ @@ -451,7 +473,7 @@ static bool wxExecuteDDE(const wxString& ddeServer, const wxString& ddeTopic, const wxString& ddeCommand) { - bool ok = FALSE; + bool ok wxDUMMY_INITIALIZE(false); wxDDEClient client; wxConnectionBase *conn = client.MakeConnection(wxEmptyString, @@ -463,22 +485,24 @@ static bool wxExecuteDDE(const wxString& ddeServer, } else // connected to DDE server { - // the added complication here is that although most - // programs use XTYP_EXECUTE for their DDE API, some - // important ones - like IE and other MS stuff - use - // XTYP_REQUEST! + // the added complication here is that although most programs use + // XTYP_EXECUTE for their DDE API, some important ones -- like Word + // and other MS stuff - use XTYP_REQUEST! // - // so we try one first and then the other one if it - // failed + // moreover, anotheri mportant program (IE) understands both but + // returns an error from Execute() so we must try Request() first + // to avoid doing it twice { + // we're prepared for this one to fail, so don't show errors wxLogNull noErrors; - ok = conn->Execute(ddeCommand); + + ok = conn->Request(ddeCommand) != NULL; } if ( !ok ) { - // now try request - but show the errors - ok = conn->Request(ddeCommand) != NULL; + // now try execute -- but show the errors + ok = conn->Execute(ddeCommand); } } @@ -736,36 +760,15 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) } #endif // wxUSE_STREAMS - // register the class for the hidden window used for the notifications - if ( !gs_classForHiddenWindow ) - { - gs_classForHiddenWindow = _T("wxHiddenWindow"); - - WNDCLASS wndclass; - wxZeroMemory(wndclass); - wndclass.lpfnWndProc = (WNDPROC)wxExecuteWindowCbk; - wndclass.hInstance = wxGetInstance(); - wndclass.lpszClassName = gs_classForHiddenWindow; - - if ( !::RegisterClass(&wndclass) ) - { - wxLogLastError(wxT("RegisterClass(hidden window)")); - } - } - // create a hidden window to receive notification about process // termination -#ifdef __WXWINCE__ - HWND hwnd = ::CreateWindow(gs_classForHiddenWindow, NULL, - WS_OVERLAPPED, - 0, 0, 0, 0, NULL, - (HMENU)NULL, wxGetInstance(), 0); -#else - HWND hwnd = ::CreateWindow(gs_classForHiddenWindow, NULL, - WS_OVERLAPPEDWINDOW, - 0, 0, 0, 0, NULL, - (HMENU)NULL, wxGetInstance(), 0); -#endif + HWND hwnd = wxCreateHiddenWindow + ( + &gs_classForHiddenWindow, + wxMSWEXEC_WNDCLASSNAME, + (WNDPROC)wxExecuteWindowCbk + ); + wxASSERT_MSG( hwnd, wxT("can't create a hidden window for wxExecute") ); // Alloc data @@ -850,6 +853,12 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) // ok, process ready to accept DDE requests ok = wxExecuteDDE(ddeServer, ddeTopic, ddeCommand); } + + if ( !ok ) + { + wxLogDebug(_T("Failed to send DDE request to the process \"%s\"."), + cmd.c_str()); + } } #endif // wxUSE_IPC