+
+long wxExecute(
+ const wxString& rCommand
+, int flags
+, wxProcess* pHandler
+)
+{
+ if (rCommand.IsEmpty())
+ {
+// cout << "empty command in wxExecute." << endl;
+ return 0;
+ }
+
+ // create the process
+ UCHAR vLoadError[CCHMAXPATH] = {0};
+ RESULTCODES vResultCodes = {0};
+ ULONG ulExecFlag;
+ PSZ zArgs = NULL;
+ PSZ zEnvs = NULL;
+ ULONG ulWindowId;
+ APIRET rc;
+ PFNWP pOldProc;
+ TID vTID;
+
+ if (flags & wxEXEC_SYNC)
+ ulExecFlag = EXEC_SYNC;
+ else
+ ulExecFlag = EXEC_ASYNCRESULT;
+
+ rc = ::DosExecPgm( (PCHAR)vLoadError
+ ,sizeof(vLoadError)
+ ,ulExecFlag
+ ,zArgs
+ ,zEnvs
+ ,&vResultCodes
+ ,(PSZ)rCommand.c_str()
+ );
+ if (rc != NO_ERROR)
+ {
+ wxLogSysError(_("Execution of command '%s' failed with error: %ul"), rCommand.c_str(), rc);
+ return 0;
+ }
+// cout << "Executing: " << rCommand.c_str() << endl;
+ // Alloc data
+ wxExecuteData* pData = new wxExecuteData;
+
+ pData->vResultCodes = vResultCodes;
+ pData->hWnd = NULLHANDLE;
+ pData->bState = (flags & wxEXEC_SYNC) != 0;
+ if (flags & wxEXEC_SYNC)
+ {
+ wxASSERT_MSG(!pHandler, wxT("wxProcess param ignored for sync execution"));
+ pData->pHandler = NULL;
+ }
+ else
+ {
+ // may be NULL or not
+ pData->pHandler = pHandler;
+ }
+
+ rc = ::DosCreateThread( &vTID
+ ,(PFNTHREAD)&wxExecuteThread
+ ,(ULONG)pData
+ ,CREATE_READY|STACK_SPARSE
+ ,8192
+ );
+ if (rc != NO_ERROR)
+ {
+ wxLogLastError("CreateThread in wxExecute");
+ delete pData;
+
+ // the process still started up successfully...
+ return vResultCodes.codeTerminate;
+ }
+ if (!(flags & wxEXEC_SYNC))
+ {
+ // 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;
+ }
+
+ // waiting until command executed
+ ::DosWaitThread(&vTID, DCWW_WAIT);
+
+ ULONG ulExitCode = pData->vResultCodes.codeResult;
+ delete pData;
+
+ // return the exit code
+ return (long)ulExitCode;
+}
+
+long wxExecute(
+ char** ppArgv
+, int flags
+, wxProcess* pHandler
+)
+{
+ wxString sCommand;
+
+ while (*ppArgv != NULL)
+ {
+ sCommand << *ppArgv++ << ' ';
+ }
+ sCommand.RemoveLast();
+ return wxExecute( sCommand
+ ,flags
+ ,pHandler
+ );
+}
+
+bool wxGetFullHostName(
+ wxChar* zBuf
+, int nMaxSize
+)
+{
+#if wxUSE_NET_API
+ char zServer[256];
+ char zComputer[256];
+ unsigned long ulLevel = 0;
+ unsigned char* zBuffer = NULL;
+ unsigned long ulBuffer = 256;
+ unsigned long* pulTotalAvail = NULL;
+
+ NetBios32GetInfo( (const unsigned char*)zServer
+ ,(const unsigned char*)zComputer
+ ,ulLevel
+ ,zBuffer
+ ,ulBuffer
+ ,pulTotalAvail
+ );
+ strncpy(zBuf, zComputer, nMaxSize);
+ zBuf[nMaxSize] = _T('\0');
+#else
+ strcpy(zBuf, "noname");
+#endif
+ return *zBuf ? TRUE : FALSE;
+ return TRUE;
+}
+