Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
ShellExecute WaitForSingleObject IsRunning(GeorgeTasker)
Message
From
19/03/2004 14:22:06
 
 
To
19/03/2004 14:03:32
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Miscellaneous
Thread ID:
00887963
Message ID:
00888012
Views:
54
UPDATE: this is weird. I checked the task manager and after closing acrobat, the process acrobat is still running in the task manager. If I stop the process in the task manager, then waitforsingleobject ends as it should and processing continues on in my app after that. Any idea why closing the app would not kill the process? I've never had that happen before and it doesn't happen anyplace else in my app where I use createprocess to run an .exe...

I just tested it again using acrord32.exe (hard coding the acrobat reader as the first param as a test) and it does the same thing. After closing the app, the process keeps running in the task manager and I have to kill it...




*G* Ok, I can successfully run my .xfdf file in Adobe Acrobat Reader now using these steps. Everything works fine, EXCEPT, waitforsingleobject never stops waiting now. It is stuck waiting indefinitley. This code launches acrobat as it should and the form is populated with the data from the .xfdf file and my program stops processing while acrobat is running as it should, but after I close acrobat, my program continues to wait...it never stops waiting...very strange.

Any ideas?
#Define ERROR_SUCCESS		0	&& OK
DO decl

oReg = NEWOBJECT("FileReg",'registry.vcx')
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

*|-- Run REAL App, with file name parameter
set DEFAULT TO c:\foxpro\vfp8
llacordok = RunAndWait( m.cAppName, '61NC.XFDF', 'C:\FOXPRO\VFP8' )
IF !llacordok
	=MESSAGEBOX("Unable to print Acord Form.",0+16+4096,"ERROR")
ELSE
	WAIT WINDOW "Finished Printing" NOWAIT
ENDIF

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))
	* waiting until the termination
	set STEP on
	= WaitForSingleObject(hProcess, INFINITE)
	= CloseHandle(hThread)
	= CloseHandle(hProcess)
ELSE
	RETURN .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
.·*´¨)
.·`TCH
(..·*

010000110101001101101000011000010111001001110000010011110111001001000010011101010111001101110100
"When the debate is lost, slander becomes the tool of the loser." - Socrates
Vita contingit, Vive cum eo. (Life Happens, Live With it.)
"Life is not measured by the number of breaths we take, but by the moments that take our breath away." -- author unknown
"De omnibus dubitandum"
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform