>*---Example and running an external app and holding processing in VFP until finished >* >lcApp="NotePad.exe" && app to run >lcCmdLine="myfile.txt" && file to open in notepad >lcdir="c:\windows\" && not required for notepad > >llokay = ExeWait(lcApp,lcCmdLine,lcdir) >IF !llokay > =MESSAGEBOX('An error ocurred.') >ELSE > =MESSAGEBOX('Program is closed, returned to vfp') >ENDIF > >RETURN > >*---------------------------------------------------------------------- >PROCEDURE ExeWait (lcApp, lcCmdLine, lcdir) >DO DECLexewait && load required dlls for exewait function >PRIVATE lntimes >lntimes = 0 >IF _VFP.AUTOYIELD = .F. > llsetback = .T. >ELSE > llsetback = .F. >ENDIF >_VFP.AUTOYIELD = .T. >PRIVATE lnclosepass >lnclosepass = 0 >#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 >DO RELexewait && release dlls for exewait function >RETURN > >*---------------------------------------------------------------------- >PROCEDURE DECLexewait && load required dlls for exewait function >=ADLLS(dllarray) >IF TYPE('ALEN(dllarray,1') <> "N" .or. ASCAN(dllarray,'CREATEPROCESS') = 0 > DECLARE INTEGER CreateProcess IN kernel32; > INTEGER lpAppName, STRING lpCmdLine, INTEGER lpProcAttr,; > INTEGER lpThrAttr, INTEGER bInhHandles, INTEGER dwCrFlags,; > INTEGER lpEnvir, INTEGER lpCurDir, ; > STRING @lpStInfo, STRING @lpProcInfo >ENDIF >IF TYPE('ALEN(dllarray,1') <> "N" .or. ASCAN(dllarray,'GETLASTERROR') = 0 > DECLARE INTEGER GetLastError IN kernel32 >ENDIF >IF TYPE('ALEN(dllarray,1') <> "N" .or. ASCAN(dllarray,"CLOSEHANDLE") = 0 > DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject >ENDIF >IF TYPE('ALEN(dllarray,1') <> "N" .or. ASCAN(dllarray,"GETEXITCODEPROCESS") = 0 > DECLARE INTEGER GetExitCodeProcess IN WIN32API INTEGER hProcess, INTEGER @lpExitCode >ENDIF >IF TYPE('ALEN(dllarray,1') <> "N" .or. ASCAN(dllarray,"SLEEP") = 0 > DECLARE Sleep IN kernel32 INTEGER dwMilliseconds >ENDIF >RETURN > >*---------------------------------------------------------------------- >PROCEDURE RELexewait && release dlls for exewait function > >CLEAR DLLS CreateProcess >CLEAR DLLS GetLastError >CLEAR DLLS CloseHandle >CLEAR DLLS GetExitCodeProcess >CLEAR DLLS Sleep > >RETURN > >*---------------------------------------------------------------------- >FUNCTION buf2dword(lcBuffer) > >RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ; > ASC(SUBSTR(lcBuffer, 2,1)) * 256 +; > ASC(SUBSTR(lcBuffer, 3,1)) * 65536 +; > ASC(SUBSTR(lcBuffer, 4,1)) * 16777216 >>