检查已执行应用程序的返回代码

时间:2011-03-14 13:41:57

标签: api powerbuilder

我希望能够检查已执行的应用程序的返回代码。

我尝试通过PowerBuilder函数Run实现它,但它不返回执行的应用程序代码。

感谢。

2 个答案:

答案 0 :(得分:4)

实际上,Run()会同步启动目标,所以当下一行PowerScript运行时,Run()应用程序可能无法完成,更不用说有可用的返回代码了。您需要自己使用适当的参数进行Windows API调用才能实现此目的,而不是依赖于PowerScript包装器,它只为您提供同步选项。

以下是我必须启动DOS命令并获取返回值。您可能需要也可能不需要根据需要将参数调整为API调用。 API调用假设是PowerBuilder的Unicode版本,即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
祝你好运,

特里。

答案 1 :(得分:2)

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将收到退出代码。