Вот несколько измененная функция запуска приложения.
Возвращает текст, выданный запускаемым приложением, получаемый с консоли. Может быть полезно при запуске консольных утилит, возвращающих результат исполнения (или ошибки) выводом на экран. (например zip, rar и так далее).
Кроме того может управлять временем ожидания выполнения приложения. При превышении времени приложение будет принудительно завершено.
Может работать при запуске и на клиенте, и на сервере (написана для ax2009, для ax4 тоже должна работать).
Может быть пригодится кому - нибудь...
Например, при запуске:
X++:
static void test(Args _args)
{
;
info(winapiserver::shellExecuteWaitInfo("cmd", "dir"));
}
Выдает:
Цитата:
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
C:\WINDOWS\system32>
Текст самой функции:
X++:
static server str shellExecuteWaitInfo(str _commandLine, str _arguments = "", int _waitTime = -1)
{
System.String outputInfo;
System.IO.StreamReader streamReader;
System.Diagnostics.Process process;
System.Diagnostics.ProcessStartInfo startInfo;
InteropPermission permission = new InteropPermission(InteropKind::ClrInterop);
System.Exception exception;
Boolean exited;
System.Text.Encoding encoding;
System.Text.Encoding encoding866;
System.Text.Encoding encodingUTF;
System.Byte[] tmp;
str ret;
;
permission.assert();
encodingUTF = System.Text.Encoding::get_Unicode();
encoding866 = System.Text.Encoding::GetEncoding(866);
startInfo = new System.Diagnostics.ProcessStartInfo(_commandLine);
process = new System.Diagnostics.Process();
if (_arguments)
{
startInfo.set_Arguments(_arguments);
}
try
{
startInfo.set_UseShellExecute(false); // для отключения диалога безопасности доступа к сетевым файлам
startInfo.set_RedirectStandardOutput(true);
process.set_StartInfo(startInfo);
process.Start();
streamReader = process.get_StandardOutput();
encoding = streamReader.get_CurrentEncoding();
outputInfo = streamReader.ReadToEnd();
process.WaitForExit(_waitTime);
exited = process.get_HasExited();
if (exited == false)
{
process.Kill();
return "";
}
tmp = encoding.GetBytes(outputInfo);
tmp = System.Text.Encoding::Convert(encoding866, encodingUTF, tmp);
ret = encodingUTF.GetString(tmp);
if (ret)
return ret;
return "ok";
}
catch (Exception::CLRError)
{
exception = CLRInterop::getLastException();
while (exception)
{
error(exception.get_Message());
exception = exception.get_InnerException();
}
return "";
}
}