Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Diskus123 am Januar 31, 2020, 23:38:15

Titel: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Januar 31, 2020, 23:38:15
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: MzKlMu am Januar 31, 2020, 23:52:20
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.
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 17:24:37
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Beaker s.a. am Februar 01, 2020, 18:09:34
@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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 19:31:20
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 19:35:28
Hab mal nen Screenshot angehangen
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: MzKlMu am Februar 01, 2020, 19:36:37
Halo,
die Vollversion und die Runtimeversion müssen die gleiche Version sein.
Lässt sich der Code kompilieren ?
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 19:41:30
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Hondo am Februar 01, 2020, 19:50:32
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 19:57:15
Ja hab ich abgeändert bin ja lernfähig  ;D
Siehe obrigen Screenshot (abgeändertes Modul)

Fehlermeldung Siehe hier
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Hondo am Februar 01, 2020, 20:10:30
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Hondo am Februar 01, 2020, 20:31:32
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: PhilS am Februar 01, 2020, 20:41:34
Ich wette, der Fehler tritt woanders auf. Möglicherweise in der aufrufenden Prozedur oder einfach ganz woanders.
-> Fehlerbehandlung ergänzen.
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 01, 2020, 21:02:23
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
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: markusxy am Februar 01, 2020, 21:10:54
Hier  (https://www.vbarchiv.net/api/api_getvolumeinformation.html)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.
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: PhilS am Februar 02, 2020, 12:54:22
Zitat von: Diskus123 am Februar 01, 2020, 21:02:23
Kann ja noch nirgens anders ausgelöst werden ist ja nix drin in der DB.
[...]
Damit erreiche ich ja mein ziel wenn ich das in das Startformular übernehme [...]
?
Wenn  in deiner DB "nix" drin ist, kann auch der in Frage stehende Code nicht aufgerufen werden.
Ein Startformular ist auch "nix"? - Ich verstehe unter "nix" einfach gar nichts. Du hast offenbar eine andere Definition.

Ich habe schon mitbekommen, dass du das konkrete Problem gelöst hast. - Ich reite nur auf dem Thema weiter rum, weil dieser Zusammenhang dir garantiert in Zukunft wieder ähnliche Probleme machen wird, wenn du das Problem des fehlenden Errorhandlings nicht angehst.
Titel: Re: Access Runtime Laufzeitfehler
Beitrag von: Diskus123 am Februar 03, 2020, 02:44:17
Da gebe ich dir ja recht ;)

Das liegt an den API Funktionen. Habe jetzt mal mehrere Beispieldatenbanken runtergeladen und getestet. Überall wo auf die Api eingegangen wird kackt die Runtime ab. Dazu muss ich mir das Errorhandling ansehen ist nur nicht ganz so einfach. Ich kann zwar "Programmieren" nur in Access tu ich mich da schweer weil mir die Syntax nicht geläufig ist. Ich weiss was ich haben möchte aber ohne Syntax ist es schweer sich alles einzeln rauszusuchen.

Heist im Mom vieeel Lese Arbeit :)

Danke aber für deine Anteilnahme löl
Diskus123