PDA

Vollständige Version anzeigen : Fehlerhafter Code?


Demian
14.09.2006, 17:05
Hallo alle zusammen,

ich habe da noch ein Problem. Um in der Firma auszuwerten wieviel wirklich gedruckt wird, will ich ein Programm schreiben, dass die Druckereignisse aus dem "System-Ereignisprotokoll" ausliest. Ich verwende hierfür folgenden Code:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim objWMIService As Object, fs As Object
Dim colLoggedEvents, Datei, objEvent

Dim Datum
Dim Uhrzeit
Dim Ereignis
Dim Benutzer
Dim Details

Dim Auswahl As String

Dim i As Long

'Auswahl = InputBox("Bitte geben Sie die auszulesende Ereignisnummer ein!", "Musterfirma")
'If Auswahl = "" Then GoTo Ende

objWMIService = GetObject("winmgmts:" & "\\.\root\cimv2")
colLoggedEvents = objWMIService.ExecQuery("Select * from Win32_NTLogEvent Where Logfile = 'WinCe Log'")

fs = CreateObject("Scripting.FileSystemObject")
Datei = fs.CreateTextFile("c:\Eventlogs.csv", True)

Datei.writeline("Datum,Uhrzeit,Ereignis,Benutzer/in,Details")

For Each objEvent In colLoggedEvents
'If objEvent.EventCode = Auswahl Then
On Error GoTo Fehler
Datum = Microsoft.VisualBasic.Left(objEvent.TimeWritten, 8)
Datum = Mid(Datum, 7, 2) & "." & Mid(Datum, 5, 2) & "." & Microsoft.VisualBasic.Left(Datum, 4)

Uhrzeit = Mid(objEvent.TimeWritten, 9, 6)
Uhrzeit = Microsoft.VisualBasic.Left(Uhrzeit, 2) & ":" & Mid(Uhrzeit, 3, 2) & ":" & Mid(Uhrzeit, 5, 2)

Ereignis = objEvent.EventCode

Benutzer = objEvent.User

Details = objEvent.Message

Datei.write(Datum & "," & Uhrzeit & "," & Ereignis & "," & Benutzer & "," & Details)

i = i + 1
'End If
Next

Datei.close()

MsgBox("Es wurden " & i & " Ereignisse der Nummer: '" & Auswahl & "' ausgelesen! Die Datei liegt unter 'C:\Eventlogs.csv'.", MsgBoxStyle.Information, "Musterfirma")

Close()
Exit Sub

Fehler:
Datei.close()
Close()
MsgBox("Fehler bei Ereignis " & i)
MsgBox(Err.Source)
End Sub

Funktioniert in der Debug-Version einwandfrei. Kritisch wird es erst, wenn ich das Programm als Release-Version installiere und ausführe, oder direkt in der Entwicklungsumgebung mit "Starten ohne Debuggen" starte. Dann knallt er bei unterschiedlichen Ereignissen auf Fehler.

msgbox err.source gibt dann "mscorlib" zurück. Ohne Abfangroutine kommt eine Meldung, die mir erzählt, dass es was mit JIT-Debuggen zu tun hat. Habe daraufhin JIT-Debuggen deaktiviert, es kommt jedoch weiterhin die Meldung mit JIT-Debuggen.

MsgBox("Fehler bei Ereignis " & i) gibt auch immer unterschiedliche Werte zurück, also handelt es sich nicht um EIN bestimmtes Ereignis, sondern passiert ganz willkürlich.

Ich stehe kurz vor der Verzweiflung und bin am Überlegen, ob ich unserem Admin einfach die "Debug-Version" gebe, aber das kann ja eigentlich nicht Sinn und Zweck der Sache sein.

Ich arbeite mit Visual Studio .NET 2003. Das Projekt beinhaltet nur eine leere Form und eine .ico Datei.

Ich hoffe, dass jemand schon ähnliche Erfahrungen gemacht hat und mir weiterhelfen kann.

Gruß
Demian

Demian
15.09.2006, 05:35
Irgendwie ist mein Knöpfchen fürs Bearbeiten des Beitrags nicht mehr da, deswegen die Info in einem neuen Beitrag:


Datei.writeline("Datum,Uhrzeit,Ereignis,Benutzer/in,Details")
soll eigentlich
Datei.writeline("Datum;Uhrzeit;Ereignis;Benutzer/in;Details")

und
Datei.write(Datum & "," & Uhrzeit & "," & Ereignis & "," & Benutzer & "," & Details)
soll eigentlich
Datei.write(Datum & ";" & Uhrzeit & ";" & Ereignis & ";" & Benutzer & ";" & Details)
sein. Hatte nur mal zum Testen Kommas verwendet. Im Endprodukt werden die Kommas aber durch Semikolons (oder Semikola?) werden, da die Datei später über workbooks.open "C:\eventlogs.csv" geöffnet wird und er bei Kommas alles in eine Zelle schreibt.

Gruß
Demian

Demian
15.09.2006, 16:45
Hallo,

wie ich gerade feststellen musste, verfügt .NET 2003 über eine Klasse "eventlog" . :rolleyes:

Das erleichtert die Sache natürlich ungemein.

Habe meinen Code jetzt folgendermaßen geändert:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'=============================================================================== ==================
'Diese Code liest das gewünschte Ereignis aus dem System-Ereignisprotokoll aus
'und importiert die relevanten Felder in eine .csv-Datei
'=============================================================================== ==================
'Ereignisprotokoll
Dim Protokoll As New EventLog
Dim Eintrag As EventLogEntry
'Für zu erzeugende Datei
Dim fs As Object
Dim Datei
'Auszulesende Felder des Ereignisprotokolls
Dim Datum
Dim Uhrzeit
Dim Ereignis
Dim Benutzer
Dim Details
'Eingabe der auszulesende Ereignis-ID
Dim Auswahl As String
'Zähler
Dim i As Long
'=============================================================================== ==================

On Error GoTo Fehler
Auswahl = InputBox("Bitte geben Sie die auszulesende Ereignisnummer ein!", "Musterfirma")
If Auswahl = "" Then GoTo Ende

'Relevantes Protokoll festlegen
Protokoll.Log = "System"

'Datei erzeugen
fs = CreateObject("Scripting.FileSystemObject")
Datei = fs.CreateTextFile("c:\Eventlogs.csv", True)
'Überschriften
Datei.writeline("Datum;Uhrzeit;Ereignis;Benutzer/in;Details")

'Auslesen der einzelnen Felder der Ereignisse
For Each Eintrag In Protokoll.Entries
If Eintrag.EventID = Auswahl Then

Datum = Microsoft.VisualBasic.Left(Eintrag.TimeWritten, 10)

Uhrzeit = Microsoft.VisualBasic.Right(Eintrag.TimeWritten, 8)

Ereignis = Eintrag.EventID

Benutzer = Eintrag.UserName

Details = Eintrag.Message

Datei.write(Datum & ";" & Uhrzeit & ";" & Ereignis & ";" & Benutzer & ";" & Details)

'Anzahl der importierten Ereignisse hochzählen
i = i + 1
End If
Next

'Schließen der erzeugten Datei
Datei.close()

MsgBox("Es wurden " & i & " Ereignisse der Nummer: '" & Auswahl & "' ausgelesen! Die Datei liegt unter 'C:\Eventlogs.csv'.", MsgBoxStyle.Information, "Musterfirma")

'Schließen der Form
Close()
Exit Sub

Fehler:
Datei.close()
Close()
MsgBox("Fehler bei Ereignis " & i)
End Sub


Scheint jetzt auch im Release stabil zu laufen :grins:

Gruß
Demian

PS: Aber seltsam war das trotzdem :confused: