llacordok = ExeWait(lcshort,hdir+xacordform+'.xfdf',lcpath) *--Uses GetExitcodeProcess instead of waitforsingleobject PROCEDURE ExeWait (lcApp, lcCmdLine, lcdir) IF _VFP.AutoYield = .F. llsetback = .T. ELSE llsetback = .F. ENDIF _VFP.AutoYield = .T. #DEFINE INFINITE 0xFFFFFFFF LOCAL lcStartupInfo, lcProcInfo, hProcess, ; lnPrio, lnIBelieve1 lnIBelieve1 = 1 && Don't remember what that was lnPrio = 32 && Priority of Process=Normal lcStartupInfo = CHR(68) + REPLI(CHR(0), 67) lcProcInfo = REPLI(CHR(0), 16) IF CreateProcess(0, m.lcApp+" "+m.lcCmdLine+CHR(0), 0,0,; m.lnIBelieve1, m.lnPrio,; 0, 0, @lcStartupInfo, @lcProcInfo) <> 0 * process and thread handles returned in ProcInfo structure hProcess = buf2dword(SUBSTR(lcProcInfo, 1,4)) hThread = buf2dword(SUBSTR(lcProcInfo, 5,4)) * waiting until the termination of the program DOEVENTS DO WHILE .T. exitcode = 0 && initialize return value to 0 = GetExitCodeProcess(hProcess, @exitcode) && try to obtain process exit code IF exitcode # 259 && not still busy EXIT && fall out of loop ENDIF = Sleep (100) && wait .1 seconds ENDDO = CloseHandle(hThread) = CloseHandle(hProcess) ELSE IF llsetback _VFP.AutoYield = .F. ENDIF RETURN .F. ENDIF IF llsetback _VFP.AutoYield = .F. ENDIF RETURN>Tracy,
>PROCEDURE RunAndWait (lcApp, lcCmdLine, lcdir) >#DEFINE INFINITE 0xFFFFFFFF >LOCAL lcStartupInfo, lcProcInfo, hProcess, ; > lnPrio, lnIBelieve1 >lnIBelieve1 = 1 && Don't remember what that was >lnPrio = 32 && Priority of Process=Normal >lcStartupInfo = CHR(68) + REPLI(CHR(0), 67) >lcProcInfo = REPLI(CHR(0), 16) >IF CreateProcess(0, m.lcApp+" "+m.lcCmdLine+CHR(0), 0,0,; > m.lnIBelieve1, m.lnPrio,; > 0, 0, @lcStartupInfo, @lcProcInfo) <> 0 > * process and thread handles returned in ProcInfo structure > hProcess = buf2dword(SUBSTR(lcProcInfo, 1,4)) > hThread = buf2dword(SUBSTR(lcProcInfo, 5,4)) > = CloseHandle(hThread) > = CloseHandle(hProcess) > * waiting until the termination > = WaitForSingleObject(hProcess, INFINITE) >ELSE > RETURN .F. >ENDIF >RETURN >