• 1. Strona główna
• 2. Kontakt: e-Mail
 
         
• 1. Baza danych
• 2. Tabele i kwerendy
• 3. Formularze
• 4. Raporty
• 5. Moduły i makra
• 6. Obsługa błędów
 
    

II.   VBA 

    
• 1. Okna Accessa
• 2. Okna Formularzy
• 3.Okna Dialogowe
• 4. Tekst
• 5. Liczby
• 6. Pliki
• 7. Inne
 
    

III.   API 

    
• 1. Ogólnie o API
• 2. Funkcje API
• 3. System
• 4. Praca z oknami
• 5. Okna dialogowe
• 6. API - Inne
 
         
• 1. Bitmapy 24 Bit
• 2. GDI i HDC
• 3. Kody kreskowe
• 4. Formant Image
• 5. FreeImage.dll
 
    

V.   Inne 

    
• 1. Shell i MsDOS
• 2. Kontrolki
• 3. ६ԼҚ ਸ
• 4. Unikod

 
Odwiedzin:

Logo AccessFAQ• I.1. Access - baza danych cz. 1 •

1.1 Jak pobrać ścieżkę folderu bazy danych ?
1.2 Jak pobrać nazwę pliku bazy danych ?
1.3 Jak otworzyć drugą bazę danych ?
1.4 Jak pokazać (ukryć) okno bazy danych ?
1.5 Jak sprawdzić, czy baza danych otwarta jest na wyłączność ?
1.6 Jak zmienić ("usunąć") pojawiającą się podczas startu bitmapę Accessa ?
1.7 Zniknęły mi niektóre obiekty w oknie bazy => Opcje bazy danych (SetOption) ?
1.8 Jak zmienić ikonę i tytuł okna Accessa, jak zabezpieczyć bazę przed klawiszem SHIFT => Opcje startowe bazy (Autostart) ?
1.9 Zabezpieczyłem bazę danych (plik *.mdb) za pomocą opcji startowych i nie mogę wejść w tryb projektowania. Co robić ?
1.10 Jak otworzyć bazę zabezpieczoną hasłem ?
1.11 Jak uniemożliwić otwarcie drugiej instancji bazy ?
1.12 Jak sprawdzić, czy jest otwarta druga instancja MS Access ?
1.13 Jak zapamiętać dane konfiguracyjne by zawsze były dostępne ?
1.14 Jak wylistować wszystkie utworzone obiekty w bazie ?
1.15 Jak odzyskać uszkodzona bazę, (plik bazy istniejący przed ostatnią defragmentacją) ?

1.11 Jak uniemożliwić otwarcie drugiej instancji bazy ?


grupa: pl.comp.bazy-danych.msaccess
wątek: Raport i OpenArgs (< A'XP)
w oparciu o artykuł: Rafała Posmyka



<REM BraZby>
     ' Private Declare Function CreateMutex Lib "kernel32" _
Alias "CreateMutexA" _
(lpMutexAttributes As Long, _
ByVal bInitialOwner As Long, _
ByVal lpName As String) As Long
</BraZby>
Private Declare Function CreateMutex Lib "kernel32" _
Alias "CreateMutexA" _
(lpMutexAttributes As SECURITY_ATTRIBUTES, _
ByVal bInitialOwner As Long, _
ByVal lpName As String) As Long

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Const ERROR_ALREADY_EXISTS = &HB7
Private hMutex As Long



' utwórzmy makro AutoExec:
' Action = RunCode
' FunctionName = rpCreateMutex ()
' a w module standardowym utwórzmy dwie publiczne Funkcje

Public Function rpCreateMutex() As Long
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)

' <cyt>
' > Ano pozwoliłem sobie mlasnąć jeden (przykład):

' Zgadnijcie co zrobi poniższy kod
' (wykonany z makra Autoexec):
' ...

Rem hMutex = CreateMutex(0&, 1, "Mutex.myAppName")
hMutex = CreateMutex(sa, 1, "Mutex.myAppName")

If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
Call ReleaseMutex(hMutex)
Call CloseHandle(hMutex)
MsgBox "Pan pozwolił tylko raz !"
Application.Quit
Else
rpCreateMutex = 1
' ... DoCmd.OpenForm "frmStart"
End If

' ...
' No właśnie zapobiega, że baza zostanie otwarta więcej niż
' raz (pomijam problematykę klawisza <Shift>). A jak zaprzęgniemy
' do tego semafor to możemy nawet pozwolić wystartować n razy.

' </ cyt>

End Function


'   funkcję poniższą powinniśmy uruchomić przy zamykaniu bazy,
'   lub gdy chcemy zezwolić by była otwarta druga instancja bazy.

Public Function rpReleaseMutex() As Long

If hMutex <> 0 Then
If ReleaseMutex(hMutex) <> 0 Then _
rpReleaseMutex = CloseHandle(hMutex)
End If

End Function

 ΔΔΔ 

1.12 Jak sprawdzić, czy jest otwarta druga instancja MS Access ?

Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long



' przykładowe wywołanie:
Private Sub btnTest_Click()
Dim lRet As Long
Const MY_CLASS_NAME As String = "OMain"

lRet = zbCountWindClass(MY_CLASS_NAME)

Select Case lRet
Case Is = 1
MsgBox "OK. Otwarta jest tylko bieżąca instancja MS Access"
Case Is > 1
MsgBox "Otwarto dodatkowo " & lRet - 1 & _
" egz. innych instancji Access'a"
' Application.Quit
Case Else
MsgBox "Nie znaleziono okna Access'a ?"
End Select

End Sub


' • sClassName - nazwa szukanej klasy okna,
' • sWinTitle - tytuł szukanego okna, dla ciągu zerowej długości
'    zliczane są wszystkie okna klasy sClassName,

Private Function zbCountWindClass(sClassName As String, _
Optional sWinTitle As String = "") As Long
Dim hNext As Long
Dim lCount As Long
Dim hDsk As Long

' ciąg zerowej długości "" to nie to samo co vbNullString
If Len(sWinTitle) = 0 Then sWinTitle = vbNullString

hDsk = GetDesktopWindow
hNext = FindWindowEx(hDsk, ByVal hNext, ByVal sClassName, ByVal sWinTitle)

Do Until hNext = 0
lCount = lCount + 1
hNext = FindWindowEx(hDsk, ByVal hNext, sClassName, sWinTitle)
Loop

zbCountWindClass = lCount

End Function

 ΔΔΔ