Показать сообщение отдельно
Старый 21.03.2011, 12:48   #20  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Вот несколько измененная функция запуска приложения.

Возвращает текст, выданный запускаемым приложением, получаемый с консоли. Может быть полезно при запуске консольных утилит, возвращающих результат исполнения (или ошибки) выводом на экран. (например 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).