Zufälliger Artikel

Problemstellung:

Wie kann ich mit Access prüfen, ob ein bestimmtes Programm bereits läuft?
Lösung mittels API Funktionen

Private Declare Function CreateToolhelpSnapshot Lib _
                          "Kernel32" Alias "CreateToolhelp32Snapshot" ( _
                          ByVal lFlgas As Long, ByVal lProcessID As Long) As Long
 
Private Declare Function ProcessFirst Lib "Kernel32" _
                          Alias "Process32First" (ByVal hSnapshot As Long, _
                          uProcess As PROCESSENTRY32) As Long
 
Private Declare Function ProcessNext Lib "Kernel32" _
                          Alias "Process32Next" (ByVal hSnapshot As Long, _
                          uProcess As PROCESSENTRY32) As Long
 
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
 
Private Const TH32CS_SNAPPROCESS As Long = 2&
 Private Const MAX_PATH As Long = 260
 
Private Type PROCESSENTRY32
     dwSize As Long
     cntUsage As Long
     th32ProcessID As Long
     th32DefaultHeapID As Long
     th32ModuleID As Long
     cntThreads As Long
     th32ParentProcessID As Long
     pcPriClassBase As Long
     dwflags As Long
     szexeFile As String * MAX_PATH
 End Type
 
' Prüft, ob eine EXE-Datei bereits ausgeführt wird
 Private Function IsEXERunning(ByVal sFilename As String) As Long
 
    Dim lSnapshot As Long
     Dim uProcess As PROCESSENTRY32
     Dim nResult As Long
 
    ' "Snapshot" des aktuellen Prozess ermitteln
     lSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
     If lSnapshot <> 0 Then
         uProcess.dwSize = Len(uProcess)
 
        ' Ersten Prozess ermitteln
         nResult = ProcessFirst(lSnapshot, uProcess)
 
        Do Until nResult = 0
             ' Prozessliste durchlaufen
             If InStr(LCase$(uProcess.szexeFile), LCase$(sFilename)) > 0 Then
                 ' Jepp - EXE gefunden
                 IsEXERunning = True
                 Exit Do
             End If
 
            ' nächster Prozess
             nResult = ProcessNext(lSnapshot, uProcess)
         Loop
 
        ' Handle schliessen
         CloseHandle lSnapshot
     End If
End Function

Aufruf:

Dim AppRun As Boolean
 If IsEXERunning("winword.exe") Then AppRun = True 'z.B. WinWord 

Die Variable "AppRun" würde den Wert True annehmen wenn Word bereits läuft.

Ähnliche Artikel

Home

1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

Problemstellung:
Benutzt man globale Variablen kommt es bei unbehandelten Laufzeitfehler zum Verlust des Variableninhaltes.
es ist auf jeden Fall ein Neustart der DB erforderlich im schlimmsten Fall kommt es zu Datenverlusten.
Wie kann ich das umgehen?
Ab Access 2007 gibt es das Objekt TempVars. Diese behalten auch bei
unbehandelten Laufzeitfehlern ihren Inhalt

Voraussetzungen:
Das Bsp ist ab A2007 lauffähig. (Download enthält eine accdb-Datei)

Lösung:
Ich möchte hier für das TempVar-Objekt nur die 4 wichtigsten Methoden aufzeigen.
Public Function NewTempVar(sVarName As String, vTempValue As Variant)
    TempVars.Add sVarName, vTempValue
End Function
Public Function GetTempVarValue(sVarName As String) As Variant
    GetTempVarValue = TempVars(sVarName)
End Function
Public Sub RemoveTempVar(sVarName As String)
    TempVars.Remove (sVarName)
End Sub
Public Sub AllRemoveTempVars()
    TempVars.RemoveAll
End Sub
Die erste Funktion erstellt eine neue Variable und füllt Diese.
z.B. mit dem Pfad der aktuellen DB (Name der Variablen =DB_Path):
NewTempVar "DB_Path", CurrentProject.Path
Ist der Variablenname bereits vorhanden wird der Inhalt einfach mit dem neuen Wert überschrieben. (s. Bsp-DB)
 
Mit der 2. Funktion wird der Inhalt der Variablen abgerufen.
Dim x As String
x = GetTempVarValue("UserName")
Die 3. und 4. Sub ermöglichen entweder eine Variable oder alle Variablen zu löschen.
 
In der Bsp-DB werden 4 Variablen erstellt und gefüllt.
Private Sub Form_Load()
    'Füllen der TempVars
    NewTempVar "UserName", ShowUserName()
    NewTempVar "TempFolder", GetTempFolder()
    NewTempVar "CurrentVersion", GetAccVersAndSP()
    NewTempVar "DB_Path", CurrentProject.Path
End Sub

Ergebnis:
 
tempvar1
Gleichzeitig werden auch 4 globale Variablen mit den den gleichen Werten gefüllt.
Private Sub Form_Load()
    'Füllen der öffentlichen Variablen
    sUser = ShowUserName()
    sTempPath = GetTempFolder()
    sAccVersion = GetAccVersAndSP()
    sDBPath = CurrentProject.Path
End Sub
tempvar3
 
Um eine Übersicht zu behalten können alle Variablen der TempVars-Auflistung angezeigt werden( s. frm_Liste):
Private Sub Form_Load()
    Dim vVar As TempVar
    For Each vVar In TempVars
        Me.lst_TempVars.AddItem vVar.Name & ";" & vVar.Value
    Next vVar
End Sub
tempvar2
Kommen wir nun zum eigentlichen Nutzen des TempVar-Objektes.
Wir lösen nun im Form mit dem Button "Fehler auslösen" einen unbehandelten Laufzeitfehler aus.
tempvar4
Dann öffnen wir mit dem Button "Auflistung aller TempVars" die Liste und siehe da, der Inhalt der Variablen ist weiterhin vorhanden.
Das Gleiche prüfen wir mit den Buttons für die globalen Variablen.
tempvar5
Die sind nun leer.
 
Also ich denke damit dürfte der Vorteil von TempVars ggü. globalen Variablen bewiesen sein.
 
 
Dateien:

Arbeiten mit dem TempVars-Objekt

ab A07

Die Zip-Datei enthält eine Version ab A07

 
Datum 05.02.2018
Dateigröße 33.04 KB
Download 560
 
 
 
 

Ähnliche Artikel

Kommentar schreiben

Sicherheitscode
Aktualisieren

Login Form

1.png1.png9.png1.png3.png6.png8.png
Heute19
Gestern75
Diese Woche417
Dieser Monat1301
Total1191368

  • IP: 54.81.71.187
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

1
Online

21. April 2018