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
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.
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
@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
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
Hab mal nen Screenshot angehangen
Halo,
die Vollversion und die Runtimeversion müssen die gleiche Version sein.
Lässt sich der Code kompilieren ?
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
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
Ja hab ich abgeändert bin ja lernfähig ;D
Siehe obrigen Screenshot (abgeändertes Modul)
Fehlermeldung Siehe hier
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
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
Ich wette, der Fehler tritt woanders auf. Möglicherweise in der aufrufenden Prozedur oder einfach ganz woanders.
-> Fehlerbehandlung ergänzen.
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
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.
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.
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