AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.10.2009, 17:20   #28  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Причесал, пофиксил и протестировал ax3sp3
(* добавил _currentDirectory, исправил определения ф-ций)

X++:
server client static int shellExecuteWait(str _commandLine, int _waitTimeMilliseconds = -1, int _cmdShow = 4, str _currentDirectory, int _creationFlags = 0)
{
    #WinAPI

    Dll             kernel32            = new Dll("kernel32.dll");
    DllFunction     createProcess       = new DllFunction(kernel32, "CreateProcessA");
    DllFunction     openProcess         = new DllFunction(kernel32, "OpenProcess");
    DllFunction     waitForSingleObject = new DllFunction(kernel32, "WaitForSingleObject");
    DllFunction     terminateProcess    = new DllFunction(kernel32, "TerminateProcess");
    DllFunction     getExitCodeProcess  = new DllFunction(kernel32, "GetExitCodeProcess");

    Binary          strartupInformation = new binary(68);
    Binary          processInformation  = new binary(16);
    Binary          exitCode            = new binary(4);
    int             hProcess;
    int             hThread;
    int             hProcessTerminate;
    int             dwProcessId;

    void cleanup()
    {;
        WinApi::closeHandle(hProcessTerminate);
        WinApi::closeHandle(hProcess);
        WinApi::closeHandle(hThread);
    }

    createProcess.returns(ExtTypes:: DWORD);// BOOL WINAPI CreateProcess(...
    createProcess.arg(  ExtTypes:: DWORD,   // in      LPCTSTR lpApplicationName,
                        ExtTypes::STRING,   // in_out  LPTSTR lpCommandLine,
                        ExtTypes:: DWORD,   // in      LPSECURITY_ATTRIBUTES lpProcessAttributes,
                        ExtTypes:: DWORD,   // in      LPSECURITY_ATTRIBUTES lpThreadAttributes,
                        ExtTypes:: DWORD,   // in      BOOL bInheritHandles,
                        ExtTypes:: DWORD,   // in      DWORD dwCreationFlags,
                        ExtTypes:: DWORD,   // in      LPVOID lpEnvironment,
                        ExtTypes::STRING,   // in      LPCTSTR lpCurrentDirectory,
                        ExtTypes::POINTER,  // in      LPSTARTUPINFO lpStartupInfo,
                        ExtTypes::POINTER); // out     LPPROCESS_INFORMATION lpProcessInformation

    openProcess.returns(ExtTypes:: DWORD);
    openProcess.arg(ExtTypes:: DWORD, ExtTypes:: DWORD, ExtTypes:: DWORD);

    waitForSingleObject.returns(ExtTypes:: DWORD);
    waitForSingleObject.arg(ExtTypes::DWORD,    // in          HANDLE hHandle,
                            ExtTypes:: DWORD);  // in          DWORD dwMilliseconds

    terminateProcess.returns(ExtTypes:: DWord);
    terminateProcess.arg(ExtTypes:: DWord, ExtTypes:: DWord);

    getExitCodeProcess.returns(ExtTypes:: DWORD);
    getExitCodeProcess.arg(ExtTypes:: DWord, ExtTypes::Pointer);

    strartupInformation.dWord(44, _cmdShow);
    try
    {
        if (! createProcess.call(0, _commandLine, 0, 0, 0, _creationFlags, 0, _currentDirectory, strartupInformation, processInformation))
            throw error(strfmt("Ошибка при запуске приложения \"%1\"", _commandLine));

        hProcess    = processInformation.dWord(0);
        hThread     = processInformation.dWord(4);
        dwProcessId = processInformation.dWord(8);
        if ( waitForSingleObject.call(hProcess, _waitTimeMilliseconds) == #STATUS_TIMEOUT)
        {
            setprefix("Принудительное завершение приложения");
            setprefix(_commandLine);
            hProcessTerminate = openProcess.call(#PROCESS_ALL_ACCESS, 0, dwProcessId);
            if (! hProcessTerminate)
                throw error("Отказано в доступе");
            if (! terminateProcess.call(hProcessTerminate, -1))
                throw error("Ошибка при завершении приложения");
            throw error("Приложение закрыто, так как не завершилось за отведенное ему время");
        }
        else
        {
            if (! getExitCodeProcess.call(hProcess, exitCode))
                throw error("Ошибка при получении кода завершения приложения");
        }
    }
    catch (Exception::Error)
    {
        cleanup();
        throw Exception::Error;
    }
    cleanup();
    return exitCode.dWord(0);

}
__________________
--- SHiSHok

Последний раз редактировалось SHiSHok; 24.10.2009 в 17:23.
За это сообщение автора поблагодарили: mazzy (2).
Теги
winapi, zip, архивирование, законченный пример, полезное, программирование, разархивировать

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Программное сохранение автоотчета в архив печати. Dima_Dima DAX: Программирование 3 29.07.2009 17:36
axaptapedia: Autozip for Dax 4.0 Blog bot DAX Blogs 0 30.04.2008 16:05
Как скачать и разархивировать файл Arahnid DAX: Программирование 10 16.11.2007 16:22
Архив technet.damgaard.com ? Torin DAX: Прочие вопросы 9 10.06.2005 20:30

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:14.