Что нового

Получение кода завершения при использовании Run

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Здравствуйте, меня интересует такая проблема:

• Функция RunWait представляет возможность запустить приложение, ожидать его завершения, вернуть код завершения приложения (exit код), но работа с консольными потоками невозможна.
• Функция Run редставляет возможность запустить приложение, вернуть ProcessID, полагаясь на который можно читать \ отправлять символы в поток (stdin, Stdout, Stderr), но я не могу получить код завершения приложения (или я не знаю как это сделать)

В общем, вопрос такой: можно-ли заставить Run возвращать код завершения приложения, и чтобы я одновременно мог работать с потоками, или-же это из ряда фантастики?
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
Теоретически возможно. Запустить из скрипта новый скрипт, который запустит RunWait и запишет возврат кода в реестр. Основной скрипт время от времени должен проверять значение в реестре.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Astel064,
Скомпилируйте файл ToRun.au3 в ToRun.exe:
Код:
#NoTrayIcon
If Not @Compiled Then Exit MsgBox(16, 'Error', 'Run Only Compiled')
For $i = 1 To 10
	$iRand = Random(100, 1000, 1)
	ToolTip('Random to console: ' & $iRand, 0, 0, 'Example', 1)
	ConsoleWrite($iRand & '|')
	Sleep(Random(1000, 2000, 1))
Next
$iExitCode = Random(1, 10, 1)
ToolTip('ExitCode: ' & $iExitCode, 0, 0, 'Example', 1)
Sleep(Random(3000, 5000, 1))
Exit $iExitCode
И запускайте его следующим кодом:
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>;см. мою подпись
#include <Constants.au3>

Opt('MustDeclareVars', 1)

Global $iPid, $hProcess, $sRead, $iExitCode

$iPid = Run(@ScriptDir & '\ToRun.exe', '', @SW_HIDE, $STDOUT_CHILD)
If Not $iPid Then Exit 13
If _WinAPI_GetVersion() >= 6.0 Then
	$hProcess = _WinAPI_OpenProcess($PROCESS_QUERY_LIMITED_INFORMATION, 0, $iPid)
Else
	$hProcess = _WinAPI_OpenProcess($PROCESS_QUERY_INFORMATION, 0, $iPid)
EndIf
If Not $hProcess Then Exit 13

While ProcessExists($iPid)
    Sleep(500)
	$sRead &= StdoutRead($iPid)
    If @error Then ExitLoop
	If $sRead Then ConsoleWrite($sRead & @LF)
WEnd
$iExitCode =  _WinAPI_GetExitCodeProcess($hProcess)
_WinAPI_CloseHandle($hProcess)
MsgBox(64, 'Info', 'StdoutRead: ' & $sRead & @LF & 'ExitCode: ' & $iExitCode)
Оба файла должны лежать в одной папке.
 
Верх