1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Various utilities
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
31 #include "wx/process.h"
33 #include "wx/msw/private.h"
39 #if !defined(__GNUWIN32__) && !defined(__SALFORDC__)
48 #include <sys/unistd.h>
65 #if !(defined(_MSC_VER) && (_MSC_VER > 800))
71 #define wxEXECUTE_WIN_MESSAGE 10000
73 struct wxExecuteData
{
82 static DWORD
wxExecuteThread(wxExecuteData
*data
)
84 WaitForSingleObject(data
->process
, INFINITE
);
86 // Send an implicit message to the window
87 SendMessage(data
->window
, wxEXECUTE_WIN_MESSAGE
, 0, (LPARAM
)data
);
94 LRESULT APIENTRY _EXPORT
wxExecuteWindowCbk(HWND hWnd
, UINT message
,
95 WPARAM wParam
, LPARAM lParam
)
97 wxExecuteData
*data
= (wxExecuteData
*)lParam
;
99 if (message
== wxEXECUTE_WIN_MESSAGE
) {
102 data
->handler
->OnTerminate((int)data
->process
, -1);
112 extern char wxPanelClassName
[];
114 long wxExecute(const wxString
& command
, bool sync
, wxProcess
*handler
)
119 #if defined(__WIN32__) && !defined(__TWIN32__)
129 // copy the command line
130 clen
= command
.Length();
131 if (!clen
) return -1;
132 cl
= (char *) calloc( 1, 256);
134 strcpy( cl
, WXSTRINGCAST command
);
136 // isolate command and arguments
137 argp
= strchr( cl
, ' ');
142 result
= ShellExecute((HWND
) (wxTheApp
->GetTopWindow() ? (HWND
) wxTheApp
->GetTopWindow()->GetHWND() : NULL
),
143 (const wchar_t) "open", (const wchar_t) cl
, (const wchar_t) argp
,
144 (const wchar_t) NULL
, SW_SHOWNORMAL
);
146 result
= ShellExecute( (HWND
) (wxTheApp
->GetTopWindow() ? wxTheApp
->GetTopWindow()->GetHWND() : NULL
),
147 "open", cl
, argp
, NULL
, SW_SHOWNORMAL
);
150 if (((long)result
) <= 32) {
153 wxLogSysError(_("Can't execute command '%s'"), command
.c_str());
158 data
= new wxExecuteData
;
161 window
= CreateWindow(wxPanelClassName
, NULL
, 0, 0, 0, 0, 0, NULL
,
162 (HMENU
) NULL
, wxGetInstance(), 0);
164 FARPROC ExecuteWindowInstance
= MakeProcInstance((FARPROC
) wxExecuteWindowCbk
,
167 SetWindowLong(window
, GWL_WNDPROC
, (LONG
) ExecuteWindowInstance
);
168 SetWindowLong(window
, GWL_USERDATA
, (LONG
) data
);
170 data
->process
= result
;
171 data
->window
= window
;
173 data
->handler
= (sync
) ? NULL
: handler
;
175 dresult
= (DWORD
)CreateThread(NULL
, 0,
176 (LPTHREAD_START_ROUTINE
)wxExecuteThread
,
177 (void *)data
, 0, &tid
);
179 wxDebugMsg("wxExecute PANIC: I can't create the waiting thread !");
180 DestroyWindow(window
);
190 // waiting until command executed
197 long instanceID
= WinExec((LPCSTR
) WXSTRINGCAST command
, SW_SHOW
);
198 if (instanceID
< 32) return(0);
204 running
= GetModuleUsage((HANDLE
)instanceID
);
211 long wxExecute(char **argv
, bool sync
, wxProcess
*handler
)
213 wxString command
= "";
215 while (*argv
!= NULL
) {
220 command
.RemoveLast();
221 return wxExecute(command
, sync
, handler
);