Цитата:
Сообщение от
AndyD
2 db
И каким образом это дает ответ на мой вопрос?
Ой

Ткнул на ссылку, не проверив содержимое. Думал что там версия, которая уже возвращает код завершения процесса. Исправляюсь тут
PHP код:
static int shellExecute(str commandLine, int _waitTime = -1, int _creationFlags = 0, int 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:: WORD, ExtTypes::STRING,
ExtTypes:: WORD, ExtTypes:: WORD,
ExtTypes:: WORD, ExtTypes:: WORD,
ExtTypes:: WORD, ExtTypes:: WORD,
ExtTypes::POINTER, ExtTypes::POINTER);
waitForSingleObject.returns(ExtTypes:: WORD);
waitForSingleObject.arg(ExtTypes::WORD, ExtTypes:: WORD);
terminateProcess.returns(ExtTypes:: Word);
terminateProcess.arg(ExtTypes:: Word, ExtTypes:: Word);
openProcess.returns(ExtTypes:: WORD);
openProcess.arg(ExtTypes:: WORD, ExtTypes:: WORD, ExtTypes:: WORD);
getExitCodeProcess.returns(ExtTypes:: WORD);
getExitCodeProcess.arg(ExtTypes:: Word, ExtTypes::Pointer);
strartupInformation.dWord(44, cmdShow);
try
{
if (! createProcess.call(0, commandLine, 0, 0, 0, _creationFlags, 0, 0, strartupInformation, processInformation))
{
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(hProcess, exitCode))
{
throw error("Ошибка при получении кода завершения приложения");
}
}
}
catch (Exception::Error)
{
cleanup();
throw Exception::Error;
}
cleanup();
return exitCode.dWord(0);
}
Про коды возрата уже ответил kvan, он же привел другой вариант запуска приложения. Выбирайте любой