Проверка кода возврата из выполненного приложения - PullRequest
1 голос
/ 14 марта 2011

Я хочу иметь возможность проверять код возврата в выполняемом приложении.

Я пытался реализовать его с помощью функции PowerBuilder Run, но он не возвращает код выполненного приложения.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 14 марта 2011

Фактически, Run () запускает цель синхронно, поэтому к моменту запуска следующей строки PowerScript ваше приложение Run () может не завершиться, не говоря уже о наличии кода возврата.Для этого вам нужно самостоятельно выполнить вызовы API Windows с соответствующими параметрами, вместо того чтобы полагаться на оболочку PowerScript, которая дает вам только синхронную опцию.

Вот что мне нужно для запуска команды DOS иполучить возвращаемое значение.Вам может понадобиться или нет необходимость настраивать параметры для вызовов API соответствующим образом.Вызовы API предполагают Unicode-версию PowerBuilder, то есть 10.0 или более позднюю.

External Function Prototypes

FUNCTION boolean CreateProcess(string AppName, string CommLine, long l1, long l2, boolean binh, long creationflags, long l3, string dir, str_startupinfo startupinfo, ref str_processinformation pi ) library 'kernel32.dll' alias for "CreateProcessW"
FUNCTION long WaitForSingleObject ( ulong ul_Notification, long lmillisecs ) library "kernel32.dll"
FUNCTION long GetExitCodeProcess(ulong hProcess,ref ulong lpExitCode) LIBRARY "kernel32.dll"
FUNCTION boolean CloseHandle(ulong h) library 'kernel32.dll'


ObjectStructure str_startupinfo

    ulong       cb
    string      lpreserved
    string      lpdesktop
    string      lptitle
    ulong       dwx
    ulong       dwy
    ulong       dwxsize
    ulong       dwysize
    ulong       dwxcountchars
    ulong       dwycountchars
    ulong       dwfillattribute
    ulong       dwflags
    uint        wshowwindow
    uint        cbreserved2
    string      lpreserved2
    uint        hstdinput
    uint        hstdoutput
    uint        hstderror

ObjectStructure str_processinformation

    unsignedlong        hprocess
    unsignedlong        hthread
    long        dwprocessid
    long        dwthreadid

function of_runandwait (string as_command, boolean ab_Visible) returns ulong

constant long STARTF_USESHOWWINDOW = 1
constant long CREATE_NEW_CONSOLE = 16
constant long NORMAL_PRIORITY_CLASS = 32
constant long INFINITE = -1
boolean lb_Return
long ll_Null, ll_CreationFlags, ll_Return
ulong lul_ProcessReturn
string ls_CurDir, ls_Null
str_StartupInfo lstr_Start
str_Processinformation lstr_PI

SetNull(ll_Null)
SetNull(ls_Null)
SetNull(ls_CurDir)

lstr_Start.cb                = 72
lstr_Start.dwFlags       = STARTF_USESHOWWINDOW
IF ab_Visible THEN
    lstr_Start.wShowWindow   = 1
ELSE
    lstr_Start.wShowWindow   = 0
END IF

ll_CreationFlags = CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS

lb_Return = CreateProcess (ls_Null, as_Command, ll_Null, ll_Null, FALSE, ll_CreationFlags, ll_Null, ls_CurDir, lstr_Start, lstr_PI)
ll_Return = WaitForSingleObject (lstr_PI.hProcess, INFINITE)
ll_Return = GetExitCodeProcess (lstr_PI.hProcess, lul_ProcessReturn)
CloseHandle(lstr_PI.hProcess)
CloseHandle(lstr_PI.hThread)

RETURN lul_ProcessReturn

Удачи,

Терри.

2 голосов
/ 15 марта 2011
OleObject wsh
integer  li_rc

CONSTANT integer MAXIMIZED = 3
CONSTANT integer MINIMIZED = 2
CONSTANT integer NORMAL = 1
CONSTANT boolean WAIT = TRUE
CONSTANT boolean NOWAIT = FALSE

wsh = CREATE OleObject
li_rc = wsh.ConnectToNewObject( "WScript.Shell" )

li_rc = wsh.Run("Notepad" , NORMAL, WAIT)
messagebox("hello", "world")

Третий параметр WAIT запускает исполняемый файл и ожидает завершения, а li_rc получит код выхода.

...