]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utilsexc.cpp
adaptions to m_peer methods
[wxWidgets.git] / src / msw / utilsexc.cpp
index 7046329ee5a42f54e3b9692c9548d589d7d99d08..43abd701ea7651a5b84bfb9ea8d508eb42a63ffd 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by:
 // Created:     04/01/98
 // RCS-ID:      $Id$
-// Copyright:   (c) 1998-2002 wxWindows dev team
+// Copyright:   (c) 1998-2002 wxWidgets dev team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
     #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 <ctype.h>
     #include <sys/stat.h>
 #endif
 
-#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
-#ifndef __UNIX__
-    #include <io.h>
-#endif
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
+    #ifndef __UNIX__
+        #include <io.h>
+    #endif
 
-#ifndef __GNUWIN32__
-#include <shellapi.h>
-#endif
+    #ifndef __GNUWIN32__
+        #include <shellapi.h>
+    #endif
 #endif
 
 #include <stdio.h>
     #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
 // ----------------------------------------------------------------------------
 // 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;
 
 // ----------------------------------------------------------------------------
@@ -108,12 +113,10 @@ struct wxExecuteData
 public:
     ~wxExecuteData()
     {
-#ifndef __WIN16__
         if ( !::CloseHandle(hProcess) )
         {
             wxLogLastError(wxT("CloseHandle(hProcess)"));
         }
-#endif
     }
 
     HWND       hWnd;          // window to send wxWM_PROC_TERMINATED to
@@ -124,7 +127,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
@@ -211,21 +235,12 @@ public:
     bool IsOk() const { return m_handles[Read] != INVALID_HANDLE_VALUE; }
 
     // return the descriptor for one of the pipe ends
-    HANDLE operator[](Direction which) const
-    {
-        wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_handles),
-                      _T("invalid pipe index") );
-
-        return m_handles[which];
-    }
+    HANDLE operator[](Direction which) const { return m_handles[which]; }
 
     // detach a descriptor, meaning that the pipe dtor won't close it, and
     // return it
     HANDLE Detach(Direction which)
     {
-        wxASSERT_MSG( which >= 0 && (size_t)which < WXSIZEOF(m_handles),
-                      _T("invalid pipe index") );
-
         HANDLE handle = m_handles[which];
         m_handles[which] = INVALID_HANDLE_VALUE;
 
@@ -258,8 +273,6 @@ private:
 // implementation
 // ============================================================================
 
-#ifdef __WIN32__
-
 // ----------------------------------------------------------------------------
 // process termination detecting support
 // ----------------------------------------------------------------------------
@@ -438,8 +451,6 @@ size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len)
 
 #endif // wxUSE_STREAMS
 
-#endif // Win32
-
 // ============================================================================
 // wxExecute functions family
 // ============================================================================
@@ -451,7 +462,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 +749,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