new wxMenu stuff and thread implementations
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4291 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
1155
src/os2/menu.cpp
1155
src/os2/menu.cpp
File diff suppressed because it is too large
Load Diff
@@ -27,18 +27,29 @@
|
|||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/ownerdrw.h"
|
|
||||||
#include "wx/menuitem.h"
|
#include "wx/menuitem.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
#if wxUSE_ACCEL
|
||||||
|
#include "wx/accel.h"
|
||||||
|
#endif // wxUSE_ACCEL
|
||||||
|
|
||||||
#include "wx/os2/private.h"
|
#include "wx/os2/private.h"
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// convenience macro
|
// macro
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// hide the ugly cast
|
||||||
#define GetHMenuOf(menu) ((HMENU)menu->GetHMenu())
|
#define GetHMenuOf(menu) ((HMENU)menu->GetHMenu())
|
||||||
|
|
||||||
|
// conditional compilation
|
||||||
|
#if wxUSE_OWNER_DRAWN
|
||||||
|
#define OWNER_DRAWN_ONLY( code ) if ( IsOwnerDrawn() ) code
|
||||||
|
#else // !wxUSE_OWNER_DRAWN
|
||||||
|
#define OWNER_DRAWN_ONLY( code )
|
||||||
|
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -48,12 +59,11 @@
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
#if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY
|
#if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY
|
||||||
#if wxUSE_OWNER_DRAWN
|
#if wxUSE_OWNER_DRAWN
|
||||||
IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxObject, wxOwnerDrawn)
|
IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxMenuItemBase, wxOwnerDrawn)
|
||||||
#else //!USE_OWNER_DRAWN
|
#else //!USE_OWNER_DRAWN
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
|
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxMenuItemBase)
|
||||||
#endif //USE_OWNER_DRAWN
|
#endif //USE_OWNER_DRAWN
|
||||||
|
|
||||||
#endif //USE_SHARED_LIBRARY
|
#endif //USE_SHARED_LIBRARY
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -63,17 +73,15 @@
|
|||||||
// ctor & dtor
|
// ctor & dtor
|
||||||
// -----------
|
// -----------
|
||||||
|
|
||||||
wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
|
wxMenuItem::wxMenuItem(wxMenu *pParentMenu,
|
||||||
const wxString& strName, const wxString& strHelp,
|
int id,
|
||||||
|
const wxString& text,
|
||||||
|
const wxString& strHelp,
|
||||||
bool bCheckable,
|
bool bCheckable,
|
||||||
wxMenu *pSubMenu) :
|
wxMenu *pSubMenu) :
|
||||||
#if wxUSE_OWNER_DRAWN
|
#if wxUSE_OWNER_DRAWN
|
||||||
wxOwnerDrawn(strName, bCheckable),
|
wxOwnerDrawn(text, bCheckable)
|
||||||
#else //no owner drawn support
|
#endif // owner drawn
|
||||||
m_bCheckable(bCheckable),
|
|
||||||
m_strName(strName),
|
|
||||||
#endif //owner drawn
|
|
||||||
m_strHelp(strHelp)
|
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") );
|
wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") );
|
||||||
|
|
||||||
@@ -88,13 +96,16 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
|
|||||||
ResetOwnerDrawn();
|
ResetOwnerDrawn();
|
||||||
|
|
||||||
#undef SYS_COLOR
|
#undef SYS_COLOR
|
||||||
#endif
|
#endif // wxUSE_OWNER_DRAWN
|
||||||
|
|
||||||
m_pParentMenu = pParentMenu;
|
m_parentMenu = pParentMenu;
|
||||||
m_pSubMenu = pSubMenu;
|
m_subMenu = pSubMenu;
|
||||||
m_bEnabled = TRUE;
|
m_isEnabled = TRUE;
|
||||||
m_bChecked = FALSE;
|
m_isChecked = FALSE;
|
||||||
m_idItem = id;
|
m_id = id;
|
||||||
|
m_text = text;
|
||||||
|
m_isCheckable = bCheckable;
|
||||||
|
m_help = strHelp;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMenuItem::~wxMenuItem()
|
wxMenuItem::~wxMenuItem()
|
||||||
@@ -107,74 +118,96 @@ wxMenuItem::~wxMenuItem()
|
|||||||
// return the id for calling Win32 API functions
|
// return the id for calling Win32 API functions
|
||||||
int wxMenuItem::GetRealId() const
|
int wxMenuItem::GetRealId() const
|
||||||
{
|
{
|
||||||
return m_pSubMenu ? (int)m_pSubMenu->GetHMenu() : GetId();
|
return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId();
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete the sub menu
|
// get item state
|
||||||
// -------------------
|
// --------------
|
||||||
void wxMenuItem::DeleteSubMenu()
|
|
||||||
|
bool wxMenuItem::IsChecked() const
|
||||||
{
|
{
|
||||||
delete m_pSubMenu;
|
/*
|
||||||
m_pSubMenu = NULL;
|
int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetId(), MF_BYCOMMAND);
|
||||||
|
|
||||||
|
// don't "and" with MF_ENABLED because its value is 0
|
||||||
|
return (flag & MF_DISABLED) == 0;
|
||||||
|
*/
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString wxMenuItem::GetLabel() const
|
||||||
|
{
|
||||||
|
return wxStripMenuCodes(m_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
// accelerators
|
||||||
|
// ------------
|
||||||
|
|
||||||
|
#if wxUSE_ACCEL
|
||||||
|
|
||||||
|
wxAcceleratorEntry *wxMenuItem::GetAccel() const
|
||||||
|
{
|
||||||
|
return wxGetAccelFromString(GetText());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_ACCEL
|
||||||
|
|
||||||
// change item state
|
// change item state
|
||||||
// -----------------
|
// -----------------
|
||||||
|
|
||||||
void wxMenuItem::Enable(bool bDoEnable)
|
void wxMenuItem::Enable(bool enable)
|
||||||
{
|
{
|
||||||
// TODO:
|
if ( m_isEnabled == enable )
|
||||||
|
return;
|
||||||
/*
|
/*
|
||||||
if ( m_bEnabled != bDoEnable ) {
|
long rc = EnableMenuItem(GetHMenuOf(m_parentMenu),
|
||||||
long rc = EnableMenuItem(GetHMenuOf(m_pParentMenu),
|
GetRealId(),
|
||||||
GetRealId(),
|
MF_BYCOMMAND |
|
||||||
MF_BYCOMMAND |
|
(enable ? MF_ENABLED : MF_GRAYED));
|
||||||
(bDoEnable ? MF_ENABLED : MF_GRAYED));
|
|
||||||
|
|
||||||
if ( rc == -1 ) {
|
if ( rc == -1 ) {
|
||||||
wxLogLastError("EnableMenuItem");
|
wxLogLastError("EnableMenuItem");
|
||||||
}
|
|
||||||
|
|
||||||
m_bEnabled = bDoEnable;
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
wxMenuItemBase::Enable(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMenuItem::Check(bool bDoCheck)
|
void wxMenuItem::Check(bool check)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") );
|
wxCHECK_RET( m_isCheckable, wxT("only checkable items may be checked") );
|
||||||
|
|
||||||
// TODO:
|
if ( m_isChecked == check )
|
||||||
|
return;
|
||||||
/*
|
/*
|
||||||
if ( m_bChecked != bDoCheck ) {
|
long rc = CheckMenuItem(GetHMenuOf(m_parentMenu),
|
||||||
long rc = CheckMenuItem(GetHMenuOf(m_pParentMenu),
|
GetRealId(),
|
||||||
GetId(),
|
MF_BYCOMMAND |
|
||||||
MF_BYCOMMAND |
|
(check ? MF_CHECKED : MF_UNCHECKED));
|
||||||
(bDoCheck ? MF_CHECKED : MF_UNCHECKED));
|
|
||||||
|
|
||||||
if ( rc == -1 ) {
|
if ( rc == -1 ) {
|
||||||
wxLogLastError("CheckMenuItem");
|
wxLogLastError("CheckMenuItem");
|
||||||
}
|
|
||||||
|
|
||||||
m_bChecked = bDoCheck;
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
wxMenuItemBase::Check(check);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMenuItem::SetName(const wxString& strName)
|
void wxMenuItem::SetText(const wxString& text)
|
||||||
{
|
{
|
||||||
// don't do anything if label didn't change
|
// don't do anything if label didn't change
|
||||||
if ( m_strName == strName )
|
if ( m_text == text )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_strName = strName;
|
wxMenuItemBase::SetText(text);
|
||||||
|
OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
|
||||||
|
/*
|
||||||
|
HMENU hMenu = GetHMenuOf(m_parentMenu);
|
||||||
|
wxCHECK_RET( hMenu, wxT("menuitem without menu") );
|
||||||
|
|
||||||
HMENU hMenu = GetHMenuOf(m_pParentMenu);
|
#if wxUSE_ACCEL
|
||||||
|
m_parentMenu->UpdateAccel(this);
|
||||||
|
#endif // wxUSE_ACCEL
|
||||||
|
|
||||||
UINT id = GetRealId();
|
UINT id = GetRealId();
|
||||||
|
|
||||||
// TODO:
|
|
||||||
/*
|
|
||||||
UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
|
UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
|
||||||
if ( flagsOld == 0xFFFFFFFF )
|
if ( flagsOld == 0xFFFFFFFF )
|
||||||
{
|
{
|
||||||
@@ -190,6 +223,7 @@ void wxMenuItem::SetName(const wxString& strName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LPCTSTR data;
|
LPCTSTR data;
|
||||||
|
|
||||||
#if wxUSE_OWNER_DRAWN
|
#if wxUSE_OWNER_DRAWN
|
||||||
if ( IsOwnerDrawn() )
|
if ( IsOwnerDrawn() )
|
||||||
{
|
{
|
||||||
@@ -200,12 +234,12 @@ void wxMenuItem::SetName(const wxString& strName)
|
|||||||
#endif //owner drawn
|
#endif //owner drawn
|
||||||
{
|
{
|
||||||
flagsOld |= MF_STRING;
|
flagsOld |= MF_STRING;
|
||||||
data = strName;
|
data = (char*) text.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ::ModifyMenu(hMenu, id,
|
if ( ::ModifyMenu(hMenu, id,
|
||||||
MF_BYCOMMAND | flagsOld,
|
MF_BYCOMMAND | flagsOld,
|
||||||
id, data) == 0xFFFFFFFF )
|
id, data) == (int)0xFFFFFFFF )
|
||||||
{
|
{
|
||||||
wxLogLastError(wxT("ModifyMenu"));
|
wxLogLastError(wxT("ModifyMenu"));
|
||||||
}
|
}
|
||||||
@@ -213,3 +247,22 @@ void wxMenuItem::SetName(const wxString& strName)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::SetCheckable(bool checkable)
|
||||||
|
{
|
||||||
|
wxMenuItemBase::SetCheckable(checkable);
|
||||||
|
OWNER_DRAWN_ONLY( wxOwnerDrawn::SetCheckable(checkable) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxMenuItemBase
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
|
||||||
|
int id,
|
||||||
|
const wxString& name,
|
||||||
|
const wxString& help,
|
||||||
|
bool isCheckable,
|
||||||
|
wxMenu *subMenu)
|
||||||
|
{
|
||||||
|
return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu);
|
||||||
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -142,23 +142,57 @@ bool wxShell(
|
|||||||
const wxString& rCommand
|
const wxString& rCommand
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
wxChar* zShell;
|
wxChar* zShell = _T("CMD.EXE");
|
||||||
|
wxString sInputs;
|
||||||
if ((zShell = wxGetenv(_T("COMSPEC"))) == NULL)
|
|
||||||
zShell = _T("\\CMD.EXE");
|
|
||||||
|
|
||||||
wxChar zTmp[255];
|
wxChar zTmp[255];
|
||||||
|
STARTDATA SData = {0};
|
||||||
|
PSZ PgmTitle = "Command Shell";
|
||||||
|
APIRET rc;
|
||||||
|
PID vPid = 0;
|
||||||
|
ULONG ulSessID = 0;
|
||||||
|
UCHAR achObjBuf[256] = {0}; //error data if DosStart fails
|
||||||
|
RESULTCODES vResult;
|
||||||
|
|
||||||
if (rCommand != "")
|
SData.Length = sizeof(STARTDATA);
|
||||||
wxSprintf( zTmp
|
SData.Related = SSF_RELATED_INDEPENDENT;
|
||||||
,"%s /c %s"
|
SData.FgBg = SSF_FGBG_FORE;
|
||||||
,zShell
|
SData.TraceOpt = SSF_TRACEOPT_NONE;
|
||||||
,WXSTRINGCAST rCommand
|
SData.PgmTitle = PgmTitle;
|
||||||
);
|
SData.PgmName = zShell;
|
||||||
else
|
|
||||||
wxStrcpy(zTmp, zShell);
|
|
||||||
|
|
||||||
return (wxExecute((wxChar*)zTmp, FALSE) != 0);
|
// sInputs = "/C " + rCommand;
|
||||||
|
SData.PgmInputs = NULL; //(BYTE*)sInputs.c_str();
|
||||||
|
SData.TermQ = 0;
|
||||||
|
SData.Environment = 0;
|
||||||
|
SData.InheritOpt = SSF_INHERTOPT_SHELL;
|
||||||
|
SData.SessionType = SSF_TYPE_WINDOWABLEVIO;
|
||||||
|
SData.IconFile = 0;
|
||||||
|
SData.PgmHandle = 0;
|
||||||
|
SData.PgmControl = SSF_CONTROL_VISIBLE | SSF_CONTROL_MAXIMIZE;
|
||||||
|
SData.InitXPos = 30;
|
||||||
|
SData.InitYPos = 40;
|
||||||
|
SData.InitXSize = 200;
|
||||||
|
SData.InitYSize = 140;
|
||||||
|
SData.Reserved = 0;
|
||||||
|
SData.ObjectBuffer = (char*)achObjBuf;
|
||||||
|
SData.ObjectBuffLen = (ULONG)sizeof(achObjBuf);
|
||||||
|
|
||||||
|
rc = ::DosStartSession(&SData, &ulSessID, &vPid);
|
||||||
|
if (rc == 0)
|
||||||
|
{
|
||||||
|
PTIB ptib;
|
||||||
|
PPIB ppib;
|
||||||
|
|
||||||
|
::DosGetInfoBlocks(&ptib, &ppib);
|
||||||
|
|
||||||
|
::DosWaitChild( DCWA_PROCESS
|
||||||
|
,DCWW_WAIT
|
||||||
|
,&vResult
|
||||||
|
,&ppib->pib_ulpid
|
||||||
|
,vPid
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (rc != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
|
// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
|
||||||
|
@@ -25,6 +25,11 @@
|
|||||||
|
|
||||||
#include "wx/os2/private.h"
|
#include "wx/os2/private.h"
|
||||||
|
|
||||||
|
#define INCL_DOSPROCESS
|
||||||
|
#define INCL_DOSERRORS
|
||||||
|
#define INCL_DOS
|
||||||
|
#include <os2.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
|
||||||
@@ -50,6 +55,7 @@ struct wxExecuteData
|
|||||||
public:
|
public:
|
||||||
~wxExecuteData()
|
~wxExecuteData()
|
||||||
{
|
{
|
||||||
|
cout << "Closing thread: " << endl;
|
||||||
DosExit(EXIT_PROCESS, 0);
|
DosExit(EXIT_PROCESS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,8 +73,10 @@ static ULONG wxExecuteThread(
|
|||||||
ULONG ulRc;
|
ULONG ulRc;
|
||||||
PID vPidChild;
|
PID vPidChild;
|
||||||
|
|
||||||
ulRc = ::DosWaitChild( DCWA_PROCESSTREE
|
cout << "Executing thread: " << endl;
|
||||||
,DCWW_WAIT
|
|
||||||
|
ulRc = ::DosWaitChild( DCWA_PROCESSTREE
|
||||||
|
,DCWW_NOWAIT
|
||||||
,&pData->vResultCodes
|
,&pData->vResultCodes
|
||||||
,&vPidChild
|
,&vPidChild
|
||||||
,pData->vResultCodes.codeTerminate // process PID to look at
|
,pData->vResultCodes.codeTerminate // process PID to look at
|
||||||
@@ -78,14 +86,11 @@ static ULONG wxExecuteThread(
|
|||||||
wxLogLastError("DosWaitChild");
|
wxLogLastError("DosWaitChild");
|
||||||
}
|
}
|
||||||
delete pData;
|
delete pData;
|
||||||
|
|
||||||
|
|
||||||
// ::WinSendMsg(pData->hWnd, (ULONG)wxWM_PROC_TERMINATED, 0, (MPARAM)pData);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlike windows where everything needs a window, console apps in OS/2
|
// window procedure of a hidden window which is created just to receive
|
||||||
// need no windows so this is not ever used
|
// the notification message when a process exits
|
||||||
MRESULT APIENTRY wxExecuteWindowCbk(
|
MRESULT APIENTRY wxExecuteWindowCbk(
|
||||||
HWND hWnd
|
HWND hWnd
|
||||||
, ULONG ulMessage
|
, ULONG ulMessage
|
||||||
@@ -128,7 +133,11 @@ long wxExecute(
|
|||||||
, wxProcess* pHandler
|
, wxProcess* pHandler
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
wxCHECK_MSG(!!rCommand, 0, wxT("empty command in wxExecute"));
|
if (rCommand.IsEmpty())
|
||||||
|
{
|
||||||
|
cout << "empty command in wxExecute." << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// create the process
|
// create the process
|
||||||
UCHAR vLoadError[CCHMAXPATH] = {0};
|
UCHAR vLoadError[CCHMAXPATH] = {0};
|
||||||
@@ -146,39 +155,20 @@ long wxExecute(
|
|||||||
else
|
else
|
||||||
ulExecFlag = EXEC_ASYNCRESULT;
|
ulExecFlag = EXEC_ASYNCRESULT;
|
||||||
|
|
||||||
if (::DosExecPgm( (PCHAR)vLoadError
|
rc = ::DosExecPgm( (PCHAR)vLoadError
|
||||||
,sizeof(vLoadError)
|
,sizeof(vLoadError)
|
||||||
,ulExecFlag
|
,ulExecFlag
|
||||||
,zArgs
|
,zArgs
|
||||||
,zEnvs
|
,zEnvs
|
||||||
,&vResultCodes
|
,&vResultCodes
|
||||||
,rCommand
|
,(PSZ)rCommand.c_str()
|
||||||
))
|
);
|
||||||
|
if (rc != NO_ERROR)
|
||||||
{
|
{
|
||||||
wxLogSysError(_("Execution of command '%s' failed"), rCommand.c_str());
|
wxLogSysError(_("Execution of command '%s' failed with error: %ul"), rCommand.c_str(), rc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
cout << "Executing: " << rCommand.c_str() << endl;
|
||||||
// PM does not need non visible object windows to run console child processes
|
|
||||||
/*
|
|
||||||
HWND hwnd = ::WinCreateWindow( HWND_DESKTOP
|
|
||||||
,wxPanelClassName
|
|
||||||
,NULL
|
|
||||||
,0
|
|
||||||
,0
|
|
||||||
,0
|
|
||||||
,0
|
|
||||||
,0
|
|
||||||
,NULLHANDLE
|
|
||||||
,NULLHANDLE
|
|
||||||
,ulWindowId
|
|
||||||
,NULL
|
|
||||||
,NULL
|
|
||||||
);
|
|
||||||
wxASSERT_MSG( hwnd, wxT("can't create a hidden window for wxExecute") );
|
|
||||||
pOldProc = ::WinSubclassWindow(hwnd, (PFNWP)&wxExecuteWindowCbk);
|
|
||||||
|
|
||||||
*/
|
|
||||||
// Alloc data
|
// Alloc data
|
||||||
wxExecuteData* pData = new wxExecuteData;
|
wxExecuteData* pData = new wxExecuteData;
|
||||||
|
|
||||||
@@ -205,8 +195,6 @@ long wxExecute(
|
|||||||
if (rc != NO_ERROR)
|
if (rc != NO_ERROR)
|
||||||
{
|
{
|
||||||
wxLogLastError("CreateThread in wxExecute");
|
wxLogLastError("CreateThread in wxExecute");
|
||||||
|
|
||||||
// ::WinDestroyWindow(hwnd);
|
|
||||||
delete pData;
|
delete pData;
|
||||||
|
|
||||||
// the process still started up successfully...
|
// the process still started up successfully...
|
||||||
@@ -214,11 +202,15 @@ long wxExecute(
|
|||||||
}
|
}
|
||||||
if (!bSync)
|
if (!bSync)
|
||||||
{
|
{
|
||||||
// clean up will be done when the process terminates
|
|
||||||
|
|
||||||
// return the pid
|
// return the pid
|
||||||
|
// warning: don't exit your app unless you actively
|
||||||
|
// kill and cleanup you child processes
|
||||||
|
// Maybe detach the process here???
|
||||||
|
// If cmd.exe need to pass DETACH to detach the process here
|
||||||
return vResultCodes.codeTerminate;
|
return vResultCodes.codeTerminate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// waiting until command executed
|
||||||
::DosWaitThread(&vTID, DCWW_WAIT);
|
::DosWaitThread(&vTID, DCWW_WAIT);
|
||||||
|
|
||||||
ULONG ulExitCode = pData->vResultCodes.codeResult;
|
ULONG ulExitCode = pData->vResultCodes.codeResult;
|
||||||
|
Reference in New Issue
Block a user