Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Access Runtime Laufzeitfehler

Begonnen von Diskus123, Januar 31, 2020, 23:38:15

⏪ vorheriges - nächstes ⏩

Diskus123

Hallo Leutz,
nach endlosem Suchen hab ich nun den Fehler gefunden der zum Laufzeitfehler führt. Ein Modul welches die Seriennummer der HDD ausliest. Das funktioniert in der Vollversion ohne Probleme Die Runtim kackt jedesmal ab ohne Fehlernummer oder Hinweis.
Hier der verwendete Code
Option Compare Database
Option Explicit

Private Declare Function GetVolumeInformation Lib "kernel32" Alias _
    "GetVolumeInformationA" (ByVal lpRootPathName As String, _
                             ByVal pVolumeNameBuffer As String, _
                             ByVal nVolumeNameSize As Long, _
                             lpVolumeSerialNumber As Long, _
                             lpMaximumComponentLength As Long, _
                             lpFileSystemFlags As Long, _
                             ByVal lpFileSystemNameBuffer As String, _
                             ByVal nFileSystemNameSize As Long) As Long

Const MAX_FILENAME_LEN As Long = 256&

Public Function SerNum() As Long
   On Error Resume Next
    Dim No As Long, s As String
   
    GetVolumeInformation "c:\", s, MAX_FILENAME_LEN, No, 0&, 0&, s, _
                         MAX_FILENAME_LEN
    SerNum = No
End Function



Im Direktfenster funzt alles beim Debuggen keine Fehler. Wie kann ich den LZF abfangen ?

lg Diskus

MzKlMu

Hallo,
was glaubst Du was diese Zeile macht:
On Error Resume Next
Die macht einfach mit der nächsten Zeile ohne Meldung weiter.
Du musst Dich also nicht wundern wenn nichts angezeigt wird.
Eine solche Zeile ist unsaubere Programmierung und hat in VBA Code nichts zu suchen.
Versuche das mal so:
Public Function SerNum() As Long
On Error GoTo SernumFehler
    Dim No As Long, s As String
    GetVolumeInformation "c:\", s, MAX_FILENAME_LEN, No, 0&, 0&, s, _
                         MAX_FILENAME_LEN
    SerNum = No
ExitSerNum:
    Exit Function
SernumFehler:
    MsgBox Err.Number & ", " & Err.Description
    Resume ExitSerNum
End Function

Eine Runtime benötigt in jeder Prozedur/Funktion eine solche Fehlerbehandlung. Dort kannst Du Dir dann eine Meldung anzeigen lassen.
Gruß Klaus

Diskus123

Erst einmal Danke für die Erklärung und die schnelle Hilfe.
Leider ist das Ergebniss das gleiche. Setze ich das Modul in die DB (hab da immo nur 1 Formular und 2 Tabellen drinn zum Test) kackt mir die Runtime mit nem Laufzeitfehler ab. Wiederum ohne Fehlermeldung also Nr oder so. Schmeisse ich das Modul raus funzt alles.

Ohne Runtime funzt alles einwandfrei.

lg Diskus

Beaker s.a.

@Diskus
ZitatOhne Runtime funzt alles einwandfrei.
Greifen beide auf das gleiche Backend zu?
Falls nicht, gibt es in den Daten mit denen die Runtime arbeitet keine
Seriennummer 0, denn was anderes gibt deine Funktion nicht zurück.
Dim No As Long
'Initialwert = 0
SerNum = No
'sprich = 0, da No dazwischen nicht verändert wird

Funzen würde es wohl mit
No = GetVolumeInformation("c:\", s, MAX_FILENAME_LEN, No, 0&, 0&, s, _
                         MAX_FILENAME_LEN)


Falls es mit der API zusammenhängt kann ich nicht weiter helfen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Diskus123

Hallo Beaker

BE ist noch keines vorhanden. Ich habe lediglich 2 Testtabellen und ein Formular ohne VB erstellt um zu testen.
Du schreibst meine Funktion gibt 0 zurück. Wenn ichs im Direktfenster eingebe wird die Seriennummer angezeigt.

Ansonsten ist in der db (wenn man das so bezeichnen soll) noch nichts anderes. Hintergrund ist eine Anwendung die ich gebastelt hab (vor gefühlt 100 Jahren) die ich auf Access 2010 aktualisiert habe.
Da wo Office 2010 installiert ist funktioniert alles ohne Fehler, bei der Runtime "Laufzeitfehler diese Anwendung wird beendet" deshalb hab ich jetzt erst mal alle Module usw einzeln auf dem "Prüfstand". Wenn ich dieses Modul rausschmeisse, kann ich das Formular bedienen und die Runtime läuft. Mit Modul direkt beim Start Laufzeitfehler. Also gehe ich davon aus das irgendetwas im Modul nicht stimmt. Nur was ?

Diskus123

Diskus123

Hab mal nen Screenshot angehangen

MzKlMu

Halo,
die Vollversion und die Runtimeversion müssen die gleiche Version sein.
Lässt sich der Code kompilieren ?
Gruß Klaus

Diskus123

Jepp lässt sich kompilieren.
Auf dem Rechner1 Office 2010 Pro
Rechner 2 Runtime 2010.

Wenn ich das Access auf dem 1 Rechner als Runtim starte erhalte ich auch den Laufzeitfehler. Wenn ich "normal" starte geht alles  :o

LG Diskus

Hondo

Hallo,
hast du mal das On Error Resume Next abgeändert wie unter #2 vorgeschlagen?
Bitte abändern, und nochmal testen und dann geänderte Fehlermeldung hier posten.

Gruß Andreas

Diskus123

Ja hab ich abgeändert bin ja lernfähig  ;D
Siehe obrigen Screenshot (abgeändertes Modul)

Fehlermeldung Siehe hier

Hondo

Hallo,
eventuell liegt es an der Deklaration der Variablen, im speziellen lpVolumeNameBuffer und lpFileSystemNameBuffer.
Besetze doch mal die Variable s wie folgt: s = String$(256, 0)
Und anstatt MAX_FILENAME_LEN, welches ja 256 repräsentiert, schreibe einfach mal 255.

Gruß Andreas

Hondo

Du weißt aber schon dass die Nummer die ausgespuckt wird nicht die Hardware-ID ist sondern zurückgesetzt wird beim Formatieren der Festplatte.
Die Hardware-ID der Laufwerke bekommt man so ganz ohne API:
Private Sub HDNummer()
    Dim objWMIService As Object
    Dim colItems As Object
    Dim objItem As Object
    Dim strComputer As String
   
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_PhysicalMedia", , 48)
    For Each objItem In colItems
        If Not IsNull(objItem.SerialNumber) Then
            Debug.Print "SerialNumber: " & Trim(objItem.SerialNumber)
        End If
    Next
End Sub

Schau die mal das Objekt objItem im Debugger an, da gibt es jede Menge an Infos welches z.B. das primäre Laufwerk ist etc.

Gruß Andreas

PhilS

Ich wette, der Fehler tritt woanders auf. Möglicherweise in der aufrufenden Prozedur oder einfach ganz woanders.
-> Fehlerbehandlung ergänzen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Diskus123

Kann ja noch nirgens anders ausgelöst werden ist ja nix drin in der DB. Habs jetzt ohne Modul gelöst.
MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("c:").SerialNumber

Damit erreiche ich ja mein ziel wenn ich das in das Startformular übernehme und abfrage (natürlich nicht als msgBox :) )

Wie sagte schon Old Hondo *fg Lesen bildet hehe. Danke für den Tipp hat weitergeholfen

Thema erledigt, Danke an alle wir lesen uns (garantiert) löl

markusxy

Hier findest du eine korrekte Deklaration.

Wenn eine fehlerhafte Deklaration zu einem Absturz führt, dann nützt auch ein Error Handling nichts.

Ich bin aber grundsätzlich auch der Meinung, dass das Problem wo anders liegt und nichts mit der Funktion zu tun hat.
Da hilft aber nur ein sinnvolles Error Handling.