Показать сообщение отдельно
Старый 02.12.2005, 19:38   #20  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от AndyD
2 db

И каким образом это дает ответ на мой вопрос?
Ой Ткнул на ссылку, не проверив содержимое. Думал что там версия, которая уже возвращает код завершения процесса. Исправляюсь тут

PHP код:
static int shellExecute(str commandLineint _waitTime = -1int _creationFlags 0int cmdShow 4)
{
    
#WinAPI
    
Dll             kernel32                    = new Dll("kernel32.dll");
    
DllFunction     createProcess             = new DllFunction(kernel32"CreateProcessA");
    
DllFunction     waitForSingleObject         = new DllFunction(kernel32"WaitForSingleObject");
    
DllFunction     terminateProcess            = new DllFunction(kernel32"TerminateProcess");
    
DllFunction     openProcess                 = new DllFunction(kernel32"OpenProcess");
    
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:: WORD);
    
createProcess.arg(ExtTypes:: WORDExtTypes::STRING,
                     
ExtTypes:: WORDExtTypes:: WORD,
                     
ExtTypes:: WORDExtTypes:: WORD,
                     
ExtTypes:: WORDExtTypes:: WORD,
                     
ExtTypes::POINTERExtTypes::POINTER);
    
waitForSingleObject.returns(ExtTypes:: WORD);
    
waitForSingleObject.arg(ExtTypes::WORDExtTypes:: WORD);
    
terminateProcess.returns(ExtTypes:: Word);
    
terminateProcess.arg(ExtTypes:: WordExtTypes:: Word);
    
openProcess.returns(ExtTypes:: WORD);
    
openProcess.arg(ExtTypes:: WORDExtTypes:: WORDExtTypes:: WORD);
    
getExitCodeProcess.returns(ExtTypes:: WORD);
    
getExitCodeProcess.arg(ExtTypes:: WordExtTypes::Pointer);
    
strartupInformation.dWord(44cmdShow);
    try
    {
        if (! 
createProcess.call(0commandLine000_creationFlags00strartupInformationprocessInformation))
        {
            throw 
error(strfmt("Ошибка при запуске приложения \"%1\""commandLine));
        }
        
hProcess    processInformation.dWord(0);
        
hThread     processInformation.dWord(4);
        
dwProcessId processInformation.dWord(8);
        if (
waitForSingleObject.call(hProcess_waitTime) == #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(hProcessexitCode))
            {
                throw 
error("Ошибка при получении кода завершения приложения");
            }
        }
    }
    catch (
Exception::Error)
    {
        
cleanup();
        throw 
Exception::Error;
    }
    
cleanup();
    return 
exitCode.dWord(0);

Про коды возрата уже ответил kvan, он же привел другой вариант запуска приложения. Выбирайте любой
За это сообщение автора поблагодарили: SHiSHok (1).