Supporto exec a 32 bit

Supporto cambio di direttorio
Supporto applicazioni spezzate


git-svn-id: svn://10.65.10.50/trunk@4538 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-06-06 09:00:01 +00:00
parent 119f3193c4
commit 35797b7f20

View File

@ -1,18 +1,21 @@
#include <stdio.h>
#define XVT_INCL_NATIVE
#define STRICT
#define XVT_INCL_NATIVE
#include <xvt.h>
#if XVT_OS == XVT_OS_WIN
#include <toolhelp.h>
#include <string.h>
#include <ctype.h>
#endif
#if XVT_OS == XVT_OS_SCOUNIX
#include <sys/fcntl.h>
#include <sys/wait.h>
#endif
#if XVT_OS == XVT_OS_WIN
#include <toolhelp.h>
#include <hlapi_c.h>
#endif
#include <applicat.h>
#include <execp.h>
@ -21,6 +24,7 @@
#include <window.h>
#include <extcdecl.h>
// @doc EXTERNAL
// @mfunc Controlla se il processo puo' essere eseguito
@ -45,7 +49,7 @@ bool TExternal_app::can_run() const
#endif
}
// @doc EXTERNAL
// @mfunc Esegue il processo
@ -59,10 +63,23 @@ word TExternal_app::run(
// @comm Se <p asyn> e' FALSE aspetta che termini il processo in esecuzione prima di iniziare il nuovo
{
TString256 path(_path);
TFilename path(_path);
TString name(path.name());
int p = name.find(' ');
if (p >=0)
name = name.left(p);
const bool our_app = name.len() > 2 && (isalpha(name[0]) || name[0] == '7') &&
isalnum(name[1]) && isdigit(name[2]);
if (!our_app)
utente = FALSE;
if (utente)
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
path << " /u" << user();
#else
path << " -u" << user();
#endif
_error = 0;
_exitcode = 0;
@ -70,20 +87,62 @@ word TExternal_app::run(
// save cwd
xvt_fsys_save_dir();
#if XVT_OS == XVT_OS_WIN
const TFilename dir(path.path());
if (dir.not_empty())
{
DIRECTORY d;
if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d))
xvt_fsys_set_dir(&d);
}
if (our_app)
{
TString parms(_path);
TString new_suffix;
int p = parms.find(' ');
if (p < 0)
{
parms = "";
new_suffix = "_0";
}
else
{
parms = parms.mid(p + 1);
p = parms.find(' ');
if (p >= 0)
new_suffix = parms.left(p);
else new_suffix = parms;
if (new_suffix[0] == '-') new_suffix[0] = '_';
else new_suffix = "__";
}
TFilename newpath(dir);
if (newpath.not_empty())
newpath << '/';
newpath << name << new_suffix;
newpath.ext("exe");
if (fexist(newpath))
{
newpath.ext("");
newpath << parms;
path = newpath;
if (utente)
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
path << " /u" << user();
#else
path << " -u" << user();
#endif
}
}
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
if (can_run())
{
TFilename dir(_path);
dir = dir.path();
if (dir.not_empty())
{
DIRECTORY d;
if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d))
xvt_fsys_set_dir(&d);
}
main_app().begin_wait();
#if XVT_OS == XVT_OS_WIN
HL_LOGOUT();
_exitcode = WinExec((char*)(const char*)path, SW_SHOW);
@ -130,9 +189,61 @@ word TExternal_app::run(
}
xvt_statbar_refresh();
}
#else
STARTUPINFO start;
PROCESS_INFORMATION pi;
start.cb = sizeof(start);
start.lpReserved = start.lpDesktop = start.lpTitle = NULL;
start.dwX = start.dwY = start.dwXSize = start.dwYSize = CW_USEDEFAULT;
start.dwXCountChars = start.dwYCountChars = start.dwFillAttribute = 0L;
start.dwFlags = STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW ;
start.cbReserved2 = 0;
start.lpReserved2 = NULL;
start.hStdInput = NULL;
start.hStdOutput = NULL ;
start.hStdError = NULL;
BOOL started = CreateProcess(NULL,(char*)(const char*)path, NULL, NULL, FALSE, 0,
NULL, NULL, &start, &pi);
if (started)
{
HANDLE hProcess = pi.hProcess;
if (!async)
{
TTemp_window tw(TASK_WIN);
if (utente)
{
tw.iconize();
tw.deactivate();
}
if (WaitForSingleObject(hProcess, INFINITE) != 0xFFFFFFFF)
{
unsigned long exitcode;
if (GetExitCodeProcess(hProcess, &exitcode))
_exitcode = (int) exitcode;
else
_exitcode = -2;
}
if (utente)
{
tw.maximize();
tw.activate();
}
}
else
_exitcode = 0;
CloseHandle(pi.hThread);
CloseHandle(hProcess);
}
else _exitcode = -1;
#endif
main_app().end_wait();
} else _exitcode = 1;
#if XVT_OS == XVT_OS_WIN
_error = _exitcode;
switch (_exitcode)
{
@ -154,6 +265,21 @@ word TExternal_app::run(
}
break;
}
#else
switch (_exitcode)
{
case -2:
error_box("Impossibile ricevere il valore di ritorno da '%s':\nErrore %ld", (const char*)_path, GetLastError()); break;
case -1:
error_box("Impossibile eseguire '%s':\nErrore %ld", (const char*)_path, GetLastError()); break;
case 8:
error_box("Risorse insufficienti per eseguire '%s'", (const char*)_path); break;
case 0:
break;
default:
error_box("Valore di ritorno di '%s':\n %ld", (const char*)_path, _exitcode); break;
}
#endif
#else
switch (fork())