>>*---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 >>>>