Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
ShellExecute WaitForSingleObject IsRunning(GeorgeTasker)
Message
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00887963
Message ID:
00921132
Views:
51
Hi Tracy,

I was wondering if this is working for you?? I need to do almost
the same thing. Except I have to look in a directory
and print out each of the PDF Files that show up there somewhere
like 50 an hour or so...

So my question to you is, when I run this I keep getting a return
value of Zero for the CreateProcess Function..I have the full
version of Adobe Acrobat 5.0 on my system as well..

Any hints / tips or tricks you could throw back at me would be
greatly appreciated!

Thanks!
Bob

Here's My Code...
*--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 	= ADDBS(SYS(5) + SYS(2003)) +  "registry.vcx"    && modify for your system
xacordform	 = ADDBS(SYS(5) + SYS(2003)) + 'Output.Pdf'        && modify for your system

DO DECL

#DEFINE ERROR_SUCCESS		0	&& OK
oReg 		= NEWOBJECT("FileReg",xregclass)
cAppKey 	= ""
cAppName 	= "C:\Program Files\Adobe\Acrobat 5.0\Acrobat\Acrobat.Exe"
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

Suspend

llacordok = ExeWait(lcshort,xacordform,lcpath)

RETURN


IF !EMPTY(lcshort) .AND. !EMPTY(lcpath)
	lcpath = "'"+lcpath+"'"
	SET DEFAULT TO &lcpath
	llacordok = RunAndWait(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)	&& 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

PROCEDURE DECL
	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
	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
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform