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:
parent
119f3193c4
commit
35797b7f20
@ -1,18 +1,21 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define XVT_INCL_NATIVE
|
|
||||||
#define STRICT
|
#define STRICT
|
||||||
|
#define XVT_INCL_NATIVE
|
||||||
#include <xvt.h>
|
#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
|
#if XVT_OS == XVT_OS_SCOUNIX
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN
|
|
||||||
#include <toolhelp.h>
|
|
||||||
#include <hlapi_c.h>
|
#include <hlapi_c.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <execp.h>
|
#include <execp.h>
|
||||||
@ -21,6 +24,7 @@
|
|||||||
#include <window.h>
|
#include <window.h>
|
||||||
#include <extcdecl.h>
|
#include <extcdecl.h>
|
||||||
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Controlla se il processo puo' essere eseguito
|
// @mfunc Controlla se il processo puo' essere eseguito
|
||||||
@ -45,7 +49,7 @@ bool TExternal_app::can_run() const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Esegue il processo
|
// @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
|
// @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 (utente)
|
||||||
|
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
|
||||||
path << " /u" << user();
|
path << " /u" << user();
|
||||||
|
#else
|
||||||
|
path << " -u" << user();
|
||||||
|
#endif
|
||||||
|
|
||||||
_error = 0;
|
_error = 0;
|
||||||
_exitcode = 0;
|
_exitcode = 0;
|
||||||
@ -70,20 +87,62 @@ word TExternal_app::run(
|
|||||||
// save cwd
|
// save cwd
|
||||||
xvt_fsys_save_dir();
|
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())
|
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();
|
main_app().begin_wait();
|
||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
HL_LOGOUT();
|
HL_LOGOUT();
|
||||||
_exitcode = WinExec((char*)(const char*)path, SW_SHOW);
|
_exitcode = WinExec((char*)(const char*)path, SW_SHOW);
|
||||||
|
|
||||||
@ -130,9 +189,61 @@ word TExternal_app::run(
|
|||||||
}
|
}
|
||||||
xvt_statbar_refresh();
|
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();
|
main_app().end_wait();
|
||||||
} else _exitcode = 1;
|
} else _exitcode = 1;
|
||||||
|
|
||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
_error = _exitcode;
|
_error = _exitcode;
|
||||||
switch (_exitcode)
|
switch (_exitcode)
|
||||||
{
|
{
|
||||||
@ -154,6 +265,21 @@ word TExternal_app::run(
|
|||||||
}
|
}
|
||||||
break;
|
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
|
#else
|
||||||
|
|
||||||
switch (fork())
|
switch (fork())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user