Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Acrobat/AcroRd.exe never kill process when closed
Message
 
To
22/03/2004 10:48:20
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00888048
Message ID:
00888631
Views:
27
>It worked four times in a row, and then stopped like waitforsingleobject. Very strange. Acrobat.exe remained running in all cases where it failed. I modified it slightly and it has not failed yet:
>
>
>
>*--Requires Acrobat Reader 4 or 5
>*--Requires registry.vcx and path stored to xregclass
>*--Requires a .pdf form with the path included and stored in xacordform
>
>xregclass = "c:\programnotes\registry.vcx"
>xacordform = "C:\foxpro\vfp8\61nc.pdf"
>
>DO declexewait
>#Define ERROR_SUCCESS		0	&& OK
>oReg = NEWOBJECT("FileReg",xregclass)
>cAppKey = ""
>cAppName = ""
>m.cExtn = "PDF"
>nErrNum = oReg.GetAppPath(m.cExtn,@cAppKey,@cAppName)
>IF m.nErrNum # ERROR_SUCCESS
>   MESSAGEBOX(C_EXTNOFOUND_LOC)
>   RETURN
>ENDIF
>IF ATC(".EXE",m.cAppName) #0
>   m.cAppName= ALLTRIM(SUBSTR(m.cAppName,1,ATC(".EXE",m.cAppName)+3))
>   IF ASC(LEFT(cAppName,1))=34 &&check for long file name in quotes
>      m.cAppName = SUBSTR(m.cAppName,2)
>   ENDIF
>ENDIF
>
>lcACORDdef = SYS(5)+SYS(2003)
>lnpos=(RAT("\",m.cAppName)+1)	&& one position to the right of
>lcshort=''
>lcpath=''
>IF lnpos > 0
>   lcshort = UPPER(SUBSTR(m.cAppName,lnpos))	&& grab from lnpos to end
>   lcpath  = UPPER(LEFT(m.cAppname,RAT("\",m.cAppname)-1))
>ENDIF
>IF !EMPTY(lcshort) .and. !EMPTY(lcpath)
>   lcpath = "'"+lcpath+"'"
>   SET DEFAULT TO &lcpath
>   llacordok = ExeWait(lcshort,xacordform,lcpath)
>ENDIF
>IF !llacordok
>   =MESSAGEBOX("Unable Start Adobe.",0+16+4096,"ERROR")
>ELSE
>   WAIT WINDOW "Finished Displaying PDF Form" NOWAIT
>ENDIF
>SET DEFAULT TO &lcACORDdef
>RETURN
>
>*----------------------------------------------------------------------
>*--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)
>	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
>
>PROCEDURE DECLexewait
>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
>DECLARE INTEGER GetLastError IN kernel32
>DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
>DECLARE INTEGER WaitForSingleObject IN kernel32;
>	INTEGER hHandle, INTEGER dwMilliseconds
>DECLARE INTEGER GetExitCodeProcess IN WIN32API INTEGER hProcess, INTEGER @lpExitCode
>DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
>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
>RETURN
>
>
>
(SNIP)

Tracy,

I think it would be better to put the DOEVENTS inside the wait loop, since you found this to be necessary in some cases.

Mike
Montage

"Free at last..."
Previous
Reply
Map
View

Click here to load this message in the networking platform