Jim Dettman
jimdettman at verizon.net
Sat Mar 6 05:51:57 CST 2010
Max, <<Is there any value in one over the other do you think?>> There is a difference. Your code uses the WaitForSingleObject API call, which pauses execution in VBA until the watched process moves into a signaled state (it releases all its threads). With my code, I'm just checking the status of a given process and code execution continues. So I loop and issue a DoEvents. I've never really used the capability, but I originally had intended to but in some type of animation/status notification, so I wanted code execution to continue. As for Stuart's point that it is a little extra work each time I use it, I suppose that's true, but then I'm not always using it to monitor a shelled process, so I keep the check separate. In general, I like to keep my building blocks of code as minimal as possible and combine when needed. I suppose I could easily do a ShellWait() type of thing, but then I would be repeating code I already have somewhere else and now I've got another procedure. Seems a lot simpler and more straight forward to me this way. Jim. -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Max Wanadoo Sent: Friday, March 05, 2010 5:03 PM To: 'Access Developers discussion and problem solving' Subject: Re: [AccessD] Shelling to a batch file Hmm, I have a similar one Jim, code below. Is there any value in one over the other do you think? Max Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Const SYNCHRONIZE = &H100000 Private Const INFINITE = -1& Public Sub pfRunUntilFinished(ByVal strApplication As String) ' EG: Call pfRunUntilFinished("C:\AbyssWebServer\htdocs\MasterIndexCopy.bat") Dim lProcID As Long Dim hProc As Long ' Start the App lProcID = Shell("CMD /C " & strApplication, vbHide) DoEvents ' Wait for the App hProc = OpenProcess(SYNCHRONIZE, 0, lProcID) If hProc <> 0 Then WaitForSingleObject hProc, INFINITE CloseHandle hProc End If exithere: Exit Sub errhandler: MsgBox "pfRunUntilFinished - Errors for " & Err.Number & Err.Description Resume exithere End Sub -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Jim Dettman Sent: Friday, March 05, 2010 9:50 PM To: 'Access Developers discussion and problem solving' Subject: Re: [AccessD] Shelling to a batch file and for those folks that want to pause until the Shelled process has finished: Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long ' Used for wait check. Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Public Sub WaitWhileRunning(lngHWnd As Long) Dim lngExitCode As Long Dim lnghProcess As Long 10 lngExitCode = STILL_ACTIVE 20 lnghProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngHWnd) 30 If lnghProcess > 0 Then 40 Do While lngExitCode = STILL_ACTIVE 50 Call GetExitCodeProcess(lnghProcess, lngExitCode) 60 DoEvents 70 Loop 80 End If End Sub Call it like this: ' Execute 170 lngHWnd = Shell(strFTPScriptFile, vbHide) 180 WaitWhileRunning (lngHWnd) Jim. -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Brad Marks Sent: Friday, March 05, 2010 4:28 PM To: Access Developers discussion and problem solving Subject: Re: [AccessD] Shelling to a batch file Max, I use the SHELL command quite a bit to fire-up .bat and .exe files from Access. Below is a snippet of VBA code which you may find useful. I am not sure if this will help you or not, but I thought that I would share what I have. Please let me know if you have any questions. Thanks, Brad Marks '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~ Const Four_Quotes As String = """" Dim Var_String_For_Shell_Command Dim Var_Program_To_Be_Initiated Dim Var_Parm_Passed_To_Initiated_Program Var_Program_To_Be_Initiated = "C:\Documents and Settings\ABC\My Documents\InitXcel.bat" Var_Parm_Passed_To_Initiated_Program = "TEST-ABC" Var_String_For_Shell_Command = _ Four_Quotes _ & Var_Program_To_Be_Initiated _ & Four_Quotes _ & " " _ & Four_Quotes _ & Var_Parm_Passed_To_Initiated_Program _ & Four_Quotes MsgBox "Var_String_For_Shell_Command = " & vbLf & vbLf & Var_String_For_Shell_Command Shell Var_String_For_Shell_Command '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Max Wanadoo Sent: Thursday, March 04, 2010 3:36 PM To: 'Access Developers discussion and problem solving' Subject: [AccessD] Shelling to a batch file Hi All, I am struggling to get the SHELL command to run a batch file from Access. Any clues or tips? The batch file in turn will run and executable in the same folder as the currentproject.path BUT this exe file is NOT installed so it is necessary to ensure that I first move to that folder and then run the batch.bat file. Eg: g\_MyTest is my currentproject.path within Access In there I have blat.exe which is not installed and which I do not want to install - so nothing in the Registry. I also have blat.bat which I have created from Access. I want to run the batch file which in turn will invoke the blat.exe and pass it parameters. The batch file runs fine if manually invoked. This is the last bit of running Blat from within Access. I will then post the lot to the List. Thanks Max This is where I am at: Private Sub sShell(sFile) ' sfile will be "blat.bat" const conQuote as string = """" Dim sPath As String ' move into the current folder because we havn't installed Blat.exe sPath = conQuote & " CD /D " & CurrentProject.Path & conQuote Debug.Print sPath ShellExecute Application.hWndAccessApp, "Open", sPath, "", "", vbNormalFocus ' now run the batch file 'sFile = conQuote & sFile & conQuote Debug.Print sFile ShellExecute Application.hWndAccessApp, "Open", sFile, "", "", vbNormalFocus End Sub -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com