Running PERL script from Access VBA

G

Guest

Hi,
Is there any way to run a Perl script directly from Access VBA? The script
parses some XML files and uploads data to an Access database using ODBC. I'd
like to be able to run this directly from Access

Thanks,
 
R

Ron Hinds

Seagull10 said:
Hi,
Is there any way to run a Perl script directly from Access VBA? The script
parses some XML files and uploads data to an Access database using ODBC. I'd
like to be able to run this directly from Access

Thanks,

Assuming you have a Perl parser installed, you could Shell out to do it. It
requires some Win32 API calls. Here's my Shell script - it optionally waits
for the shelled application to exit before continuing.

Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hProcess
As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function InputIdle Lib "user32" Alias "WaitForInputIdle"
(ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal
bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment
As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO,
lpProcessInformation As PROCESS_INFORMATION) As Long

Private Const NORMAL_PRIORITY_CLASS As Long = &H20&
Private Const INFINITE As Long = -1&

Private Const STATUS_WAIT_0 As Long = &H0
Private Const WAIT_OBJECT_0 As Long = STATUS_WAIT_0

Private Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Public Function SyncShell(CommandLine As String, Optional Timeout As Long =
0, _
Optional WaitForInputIdle As Boolean = False, Optional Hide As Boolean =
False) As Boolean

Dim hProcess As Long

Dim ret As Long
Dim nMilliseconds As Long

If Timeout > 0 Then
nMilliseconds = Timeout
Else
nMilliseconds = INFINITE
End If

hProcess = StartProcess(CommandLine, Hide)

If WaitForInputIdle Then
'Wait for the shelled application to finish setting up its UI:
ret = InputIdle(hProcess, nMilliseconds)
Else
'Wait for the shelled application to terminate:
ret = WaitForSingleObject(hProcess, nMilliseconds)
End If

CloseHandle hProcess

'Return True if the application finished. Otherwise it timed out or
erred.
SyncShell = (ret = WAIT_OBJECT_0)

End Function

Public Function StartProcess(CommandLine As String, Optional Hide As Boolean
= False) As Long

Const STARTF_USESHOWWINDOW As Long = &H1
Const SW_HIDE As Long = 0

Dim Proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO

'Initialize the STARTUPINFO structure:
Start.cb = Len(Start)
If Hide Then
Start.dwFlags = STARTF_USESHOWWINDOW
Start.wShowWindow = SW_HIDE
End If
'Start the shelled application:
CreateProcessA 0&, CommandLine, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc

StartProcess = Proc.hProcess

End Function
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top