|
![]() |
#1 |
Участник
|
Цитата:
сделал - архив файла 0(нуль) и 300 Мб. а также команда dir в пустом каталоге, а также несуществующая команда не удалось повторить ошибку а вот так что у вас вернет и будет ли результат? по вашей версии процесс уже выполнен и все нормально X++: process.Start(); // process.WaitForExit(); exitCode = process.get_ExitCode(); info(strFmt([COLOR=red]"%1"[/COLOR],exitCode )); |
|
![]() |
#2 |
Участник
|
Файл распакован, в результате - 0.
|
|
![]() |
#3 |
Участник
|
http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx
Цитата:
Сообщение от цитата из ссылки
If you pass 0 (zero) to the method, it returns true only if the process has already exited.
предлагаю такой вариант X++: while(!process.WaitForExit(0)) //проверяем, что процесс еще не закончен в Х++ { sleep(100); } |
|
|
За это сообщение автора поблагодарили: Beast-L (1). |
![]() |
#4 |
Участник
|
Для запуска на стороне сервера различных консольных exe написал такую функцию (для DAX2009) в классе WinAPIServer.
Позволяет также управлять временем ожидания выполнения приложения. Возвращает результат (успешное / не успешное завершение) X++: static server boolean shellExecuteWait(str _commandLine, str _arguments = "", int _waitTime = -1) { System.Diagnostics.Process process; System.Diagnostics.ProcessStartInfo startInfo; InteropPermission permission = new InteropPermission(InteropKind::ClrInterop); System.Exception exception; Boolean exited; ; permission.assert(); startInfo = new System.Diagnostics.ProcessStartInfo(_commandLine); process = new System.Diagnostics.Process(); if (_arguments) { startInfo.set_Arguments(_arguments); } try { startInfo.set_UseShellExecute(false); // для отключения диалога безопасности доступа к сетевым файлам process.set_StartInfo(startInfo); process.Start(); process.WaitForExit(_waitTime); exited = process.get_HasExited(); if (exited == false) { process.Kill(); return false; } return true; } catch (Exception::CLRError) { exception = CLRInterop::getLastException(); while (exception) { error(exception.get_Message()); exception = exception.get_InnerException(); } return false; } } |
|
|
За это сообщение автора поблагодарили: gl00mie (2), player (1). |
![]() |
#5 |
Участник
|
Цитата:
Сообщение от titov
![]() http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx
Если вы передаете 0 (ноль) к методу, то возвращает истину, только если процесс уже завершился предлагаю такой вариант X++: while(!process.WaitForExit(0)) //проверяем, что процесс еще не закончен в Х++ { sleep(100); } В общем для своей задачи я нашел решение которое меня полностью устроило, это библиотека .NET IonicZip. |
|
![]() |
#6 |
Участник
|
Вот несколько измененная функция запуска приложения.
Возвращает текст, выданный запускаемым приложением, получаемый с консоли. Может быть полезно при запуске консольных утилит, возвращающих результат исполнения (или ошибки) выводом на экран. (например 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 ""; } } |
|
|
За это сообщение автора поблагодарили: konfet (1). |
![]() |
#7 |
Участник
|
Вот исправленный текст функции shellExecuteWaitInfo.
В прошлом варианте не работала настройка waitTime - время ожидания окончания процесса... X++: static client 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(); process.WaitForExit(_waitTime); exited = process.get_HasExited(); if (exited == false) { process.Kill(); return ""; } outputInfo = streamReader.ReadToEnd(); 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 ""; } } |
|
|
За это сообщение автора поблагодарили: Logger (5), Link (4). |
Теги |
64-bit, aos, ax2009, dllfunction, winapi, zip |
|
|