Returning to Blitz after ExecFile()

Blitz3D Forums/Blitz3D Programming/Returning to Blitz after ExecFile()

Try this , something I got together some while ago.
It's not tested all that much so don't be suprised if strange things happens =).
But hope it can help you.

;---------------------------------------------------------------
; Exec and wait by Thomas Jansson aka Spindeln
;---------------------------------------------------------------

;---------------------------------------------------------------
; Userlib
;---------------------------------------------------------------

;
;.lib "kernel32.dll"
;
;api_lstrcpy%(bank*,String$):"lstrcpyA"
;api_CreateProcess%(lpAppName%,lpCLine%,lpProcAtt%,lpThreadAtt%,bInhHan%,dwCreFlags%,lpEnv%,lpCurDir%,lpStartInf%,lpProcInf):"CreateProcessA"
;api_WaitForSingleObject%(hHandle,dwMilliseconds):"WaitForSingleObject"
;api_MulDiv%(a*,b%,c%):"MulDiv"
;api_CloseHandle(Handle%):"CloseHandle"
;
;.lib "user32.dll"
;api_FindWindow%(Class%,Title$):"FindWindowA"
;api_ShowWindow%(hWnd%,nCmdShow%):"ShowWindow"
;

;---------------------------------------------------------------
; Windows constants
;---------------------------------------------------------------

Const STARTF_USESHOWWINDOW    		= $00000001
Const CREATE_DEFAULT_ERROR_MODE   	= $04000000
Const SW_HIDE             			= 0
Const SW_SHOW             			= 5
Const INFINITE            			= $FFFFFFFF  ; Infinite timeout

;---------------------------------------------------------------
; Ptr by Koriolis and (or) soja
;---------------------------------------------------------------

Function Ptr%(Bank)

	Return api_MulDiv(Bank,1,1)

End Function 

;---------------------------------------------------------------
; Exec
;---------------------------------------------------------------

Function Exec%(FileName$,CurrentDirectory$)

	If FileName$ = "" Then Return False

	Local STARTUPINFO 		  = CreateBank(68)
	Local PROCESS_INFORMATION = CreateBank(16)
	Local FileNameBank		  = CreateBank(Len(FileName$)) 
	Local FileNameStr         = api_lstrcpy(FileNameBank,FileName$)
	Local CurDirBank		  = 0
	Local CurDirStr			  = 0
	
	If CurrentDirectory$<>"" Then
	
		CurDirBank = CreateBank(Len(CurrentDirectory$))
		CurDirStr  = api_lstrcpy(CurDirBank,CurrentDirectory$)
	
	EndIf
	
	PokeInt(STARTUPINFO,0,BankSize(STARTUPINFO))
	PokeInt(STARTUPINFO,4,0)
	PokeInt(STARTUPINFO,8,0)
	PokeInt(STARTUPINFO,12,0)
	
	PokeInt(STARTUPINFO,16,0)
	PokeInt(STARTUPINFO,20,0)
	PokeInt(STARTUPINFO,24,0)
	PokeInt(STARTUPINFO,28,0)
	PokeInt(STARTUPINFO,32,0)
	PokeInt(STARTUPINFO,36,0)
	PokeInt(STARTUPINFO,40,0)
	PokeInt(STARTUPINFO,44,STARTF_USESHOWWINDOW)
	
	PokeShort(STARTUPINFO,48,SW_SHOW)
	PokeShort(STARTUPINFO,50,0)
	PokeByte(STARTUPINFO,52,0)

	PokeInt(STARTUPINFO,53,0)
	PokeInt(STARTUPINFO,57,0)
	PokeInt(STARTUPINFO,61,0)
	
	If Not api_CreateProcess(0,FileNameStr,0,0,False,CREATE_DEFAULT_ERROR_MODE,0,CurDirStr,Ptr(STARTUPINFO),Ptr(PROCESS_INFORMATION))
		
		If CurDirBank <> 0 Then FreeBank(CurDirBank)
		FreeBank(FileNameBank)
		FreeBank(STARTUPINFO)
		FreeBank(PROCESS_INFORMATION)

		RuntimeError("Could not create process")
		
	EndIf
	
	api_WaitForSingleObject(PeekInt(PROCESS_INFORMATION,0),INFINITE)
	
	api_CloseHandle(PeekInt(PROCESS_INFORMATION,0))
	api_CloseHandle(PeekInt(PROCESS_INFORMATION,4))

	If CurDirBank <> 0 Then FreeBank(CurDirBank)
	FreeBank(FileNameBank)
	FreeBank(STARTUPINFO)
	FreeBank(PROCESS_INFORMATION)

End Function

;---------------------------------------------------------------
; Main
;---------------------------------------------------------------

Const Title$ = "Exec test"

AppTitle(Title$)

Graphics3D(640,480,32)

hWnd = api_FindWindow(0,Title$) 

If hWnd = 0 Then RuntimeError("No blitz handle sucker!")

Camera = CreateCamera()
PositionEntity(Camera,0,0,-5)
Light = CreateLight()
Cube = CreateCube()

While Not KeyDown(1)

	RenderWorld()
	UpdateWorld()
	
	TurnEntity(Cube,1,1,1)
	
	If KeyDown(59) Then 
		api_ShowWindow(hWnd,SW_HIDE)
		Exec("notepad.exe","")
 		api_ShowWindow(hWnd,SW_SHOW)
	EndIf
	
	Text 0,0,"Press F1 to start notepad"
	Text 0,10,"Then close notepad to get back in business"

	Flip()

Wend