Question Start an Access app from an external program? (1 Viewer)

lcarpay

Registered User.
Local time
Today, 09:00
Joined
Oct 20, 2017
Messages
11
hi experts, I have been searching but I can't find the solution. What I want is the following:
Provide a command-line option to an external program to:
  • check whether myAccessApp is already open
  • if so then activate myAccessApp and open e.g. a form with the provided external Id
  • if closed then open myAccessApp and open e.g. a form with the provided Id via /cmd or the autoexec

Anyone? thanks
 

theDBguy

I’m here to help
Staff member
Local time
Today, 01:00
Joined
Oct 29, 2018
Messages
21,358
Hi. We might be able to tell you how to use Access to manipulate an external program, but it’s a lot harder to tell you how to use an external program to manipulate Access, especially without knowing what the external program is. Can you give us more details please? Thanks.
 

isladogs

MVP / VIP
Local time
Today, 08:00
Joined
Jan 14, 2017
Messages
18,186
Just adding to the previous comments, it may be easier to use a batch file or vb script to run the Access app. Your external program could possibly be used to run those.

Or you could use a scheduled task for the purpose


Sent from my iPhone using Tapatalk
 

lcarpay

Registered User.
Local time
Today, 09:00
Joined
Oct 20, 2017
Messages
11
Hi, the external applications in scope now are SalesForce and a custom made automatic PhoneResponse application. Starting myAccessApp when it is not active is not that hard but how to detect if myAccessApp is active?
 

theDBguy

I’m here to help
Staff member
Local time
Today, 01:00
Joined
Oct 29, 2018
Messages
21,358
Hi, the external applications in scope now are SalesForce and a custom made automatic PhoneResponse application. Starting myAccessApp when it is not active is not that hard but how to detect if myAccessApp is active?
I am not familiar with how those other apps interact with Access. What methods are available to manipulate other apps from within them? For example, do they have VBA? If not, what exactly do you use to start your Access App from SalesForce or PhoneResponse?
 

isladogs

MVP / VIP
Local time
Today, 08:00
Joined
Jan 14, 2017
Messages
18,186
You can check if your Access app is running by looking for the existence of the lock LACCDB file. It’s not quite 100% effective as occasionally it doesn’t get deleted when apps close. Also if your app is opened in exclusive mode no lock file is created.


Sent from my iPhone using Tapatalk
 

Gasman

Enthusiastic Amateur
Local time
Today, 08:00
Joined
Sep 21, 2011
Messages
14,050
I use this vba script to kill a process. You could probably adapt it ?

Code:
' ProcessKillLocal.vbs
' Sample VBScript to kill a program
' Author Guy Thomas http://computerperformance.co.uk/
' Version 2.7 - December 2010
' ------------------------ -------------------------------' 
Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill 
strComputer = "."
strProcessKill = "'msaccess.exe'" 

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _ 
& strComputer & "\root\cimv2") 

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
'Next 
WSCript.Echo "Just killed process " & strProcessKill _
& " on " & strComputer

Next
WScript.Quit 
' End of WMI Example of a Kill Process
 

arnelgp

..forever waiting... waiting for jellybean!
Local time
Today, 16:00
Joined
May 7, 2009
Messages
19,169
you can use api to get ms access window handle number if the app is running. 0 if not running:
Code:
Option Explicit

' Module Name: ModFindWindowLike
' (c) 2005 Wayne Phillips (http://www.everythingaccess.com)
' Written 02/06/2005
'
' mODIFIED bY aRNELgP FOR x64 aCCESS
'
                   
#If VBA7 Then
    #If Win64 Then
        Private Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
        Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
        'Could use global variables instead, but this is nicer.
        'Custom structure for passing in the parameters in/out of the hook enumeration function
        'Could use global variables instead, but this is nicer.
        Private Type FindWindowParameters
        
            strTitle As String  'INPUT
            hwnd As LongPtr     'OUTPUT
        
        End Type
    #Else
        Private Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
        Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
        'Could use global variables instead, but this is nicer.
        'Custom structure for passing in the parameters in/out of the hook enumeration function
        'Could use global variables instead, but this is nicer.
        Private Type FindWindowParameters
        
            strTitle As String  'INPUT
            hwnd As Long         'OUTPUT
        
        End Type
    #End If
#Else
                    
        Private Declare Function EnumWindows Lib "user32" _
           (ByVal lpEnumFunc As Long, _
            ByVal lParam As Long) As Long
        
        Private Declare Function GetWindowText Lib "user32" _
            Alias "GetWindowTextA" _
           (ByVal hwnd As Long, _
            ByVal lpString As String, _
            ByVal cch As Long) As Long
        'Could use global variables instead, but this is nicer.
        'Custom structure for passing in the parameters in/out of the hook enumeration function
        'Could use global variables instead, but this is nicer.
        Private Type FindWindowParameters
        
            strTitle As String  'INPUT
            hwnd As Long        'OUTPUT
        
        End Type
#End If


#If VBA7 And Win64 Then
Public Function FnFindWindowLike(strWindowTitle As String) As LongPtr

#Else
Public Function FnFindWindowLike(strWindowTitle As String) As Long
#End If
    
    'We'll pass a custom structure in as the parameter to store our result...
    Dim Parameters As FindWindowParameters
    Parameters.strTitle = UCase(strWindowTitle) ' Input parameter
    

#If VBA7 And Win64 Then
    Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))
#Else
    Call EnumWindows(AddressOf EnumWindowProc, VarPtr(Parameters))
#End If
    FnFindWindowLike = Parameters.hwnd
    
End Function

#If VBA7 And Win64 Then
Private Function EnumWindowProc(ByVal hwnd As LongPtr, _
                               lParam As FindWindowParameters) As LongPtr
#Else
Private Function EnumWindowProc(ByVal hwnd As Long, _
                               lParam As FindWindowParameters) As Long
#End If
   Dim strWindowTitle As String

   strWindowTitle = Space(260)
   Call GetWindowText(hwnd, strWindowTitle, 260)
   strWindowTitle = UCase(TrimNull(strWindowTitle)) ' Remove extra null terminator
                                          
   If strWindowTitle Like lParam.strTitle Then
   
        lParam.hwnd = hwnd 'Store the result for later.
        EnumWindowProc = 0 'This will stop enumerating more windows
   
   Else

        EnumWindowProc = 1

   End If
                           
End Function

Private Function TrimNull(strNullTerminatedString As String)

    Dim lngPos As Long

    'Remove unnecessary null terminator
    
    lngPos = InStr(strNullTerminatedString, Chr$(0))
   
    If lngPos Then
        TrimNull = Left$(strNullTerminatedString, lngPos - 1)
    Else
        TrimNull = strNullTerminatedString
    End If
   Debug.Print TrimNull
End Function


Private Sub test()
#If VBA7 And Win64 Then
    Dim h As LongPtr
#Else
    Dim h As Long
#End If
    Dim i As Integer
    Dim wa As Word.Application
    Dim wd As Word.Document
    
    Set wa = New Word.Application
    Set wd = wa.Documents.Add
    wa.Visible = True
    'wa.Activate
    h = FnFindWindowLike("*word*")
    Debug.Print h
    Call MouseToWinHandle(h)
    For i = 1 To 5000
        DoEvents
    Next i
    Call MouseToForm
    wa.Quit False
End Sub

sample from vbe immediate window:

debug.print fnWindowLike("*access*")
 

lcarpay

Registered User.
Local time
Today, 09:00
Joined
Oct 20, 2017
Messages
11
Thanks you all. Enough reactions to get me going. I have have to investigate the offered solutions (and hints of solution directions). The result will be posted.
 

Users who are viewing this thread

Top Bottom