X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14f355c2b5c71fc7c3d680aea366582d2ac60f7b..c0a83c519b566f9a306990cfc8275e512352628f:/src/msw/utilsexc.cpp diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index f1408c299e..b969c899bf 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -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, @@ -738,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 @@ -852,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