Verificar si la base de datos que se abre ya ha sido abierta


Volver
'*********************************************************
' El siguiente código se encarga de averiguar si ya
' existe una instancia abierta de la base de datos que
' se está abriendo en ese momento.
'
' Ejemplo de uso:
'
' If PrevInstance = True Then
'   MsgBox "Ya existe una instancia de la base actual"
'   DoCmd.Quit
' End If
'
' Autor: Juan M. Afán de Ribera
' Fecha: Junio 2004
'
' ¿Por qué? porque alguien lo preguntó y a mí me gusta
' complicarme la vida...
'
Private Declare Function FindWindowEx Lib "user32.dll" _
                Alias "FindWindowExA" _
                (ByVal hWnd1 As Long, _
                ByVal hWnd2 As Long, _
                ByVal lpsz1 As String, _
                ByVal lpsz2 As String) As Long
                
Private Declare Function GetWindow Lib "user32.dll" _
                (ByVal hwnd As Long, _
                ByVal wCmd As Long) As Long
                
Private Declare Function GetDesktopWindow _
                Lib "user32.dll" () As Long

Private Declare Function GetWindowText Lib "user32.dll" _
                Alias "GetWindowTextA" _
                (ByVal hwnd As Long, _
                ByVal lpString As String, _
                ByVal cch As Long) As Long
                
Private Declare Function GetClassName Lib "user32.dll" _
                Alias "GetClassNameA" _
                (ByVal hwnd As Long, _
                ByVal lpClassName As String, _
                ByVal nMaxCount As Long) As Long

Private Const GW_HWNDNEXT = 2&
Private Const GW_CHILD = 5&

' Esta función enumera las ventanas abiertas y comprueba
' que no sea otra ventana de Access. En caso de que 
' encuentre una, compara los títulos de las ventanas
' de base de datos. Si son iguales es que ya hay una
' instancia abierta de la base de datos.
'
Function PrevInstance() As Boolean
Dim sODb1 As String, sODb2 As String, sClass As String
Dim hwnd As Long

    ' averiguamos el título de la ventana Base de Datos
    sODb1 = ODbCaption(hWndAccessApp)
    
    ' enumeramos las ventanas abiertas
    hwnd = GetWindow(GetDesktopWindow, GW_CHILD)
    sClass = Space(255)
    
    Do
      If hwnd Then
        ' si la ventana no es la de nuestra aplicación
        If hwnd <> hWndAccessApp Then
          ' averiguamos el nombre de la clase de ventana
          Call GetClassName(hwnd, sClass, 255)
          ' si la ventana es una ventana de Access...
          If Trim(sClass) = "OMain" & vbNullChar Then
            sODb2 = ODbCaption(hwnd)
            ' si la ventana base de datos tiene el mismo
            ' título que la nuestras, es que ya está 
            ' abierta
            If sODb2 = sODb1 Then
              PrevInstance = True
              Exit Function
            End If
          End If
        End If
          sClass = Space(255)
          ' obtenemos el manipulador de la siguiente 
          ' ventana abierta
          hwnd = GetWindow(hwnd, GW_HWNDNEXT)
      Else
        Exit Do
      End If
    Loop
        
End Function

' Esta función devuelve el título de la ventana base de
' datos de una aplicación de Access. El argumento hwnd
' ha de ser la propiedad hWndAccessApp (manipulador de
' la ventana principal de Access)
'
Function ODbCaption(hwnd As Long) As String
Dim sODb As String
Dim hMDi As Long, hODb As Long

    ' obtenemos el manipulador de ventana de la ventana
    ' MDI de Access
    hMDi = FindWindowEx(hwnd, 0&, "MDIClient", vbNullString)
    
    ' obtenemos el manipulador de ventana de la ventana
    ' base de datos
    hODb = FindWindowEx(hMDi, 0&, "ODb", vbNullString)
    
    ' averiguamos el título de la ventana base de datos
    sODb = String(255, " ")
    Call GetWindowText(hODb, sODb, 255)
    ODbCaption = Trim(sODb)
    
End Function
'*********************************************************
Contactar Última actualización 15/06/2004    © Juan M. Afán deRibera