| |
VB.NET - FortgeschritteneFatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Seek1 | Datum: 08.05.20 11:20 |
| Hallo Leute,
Wollte meine Software ein wenig personalisieren und habe dazu einige 0815 Dongel erworben.
Die Einbindung funktionierte auch ohne Fehler.
Irgendwannn dann fiel mir auf, dass das Programm sich ohne irgendetwas (UnhandledExceptions werden abgefangt) verabschiedet.
Ab und zu kam im Debugging der Fehler "FatalExecutionError" mit dem Fehlercode 0xc0000005.
Jedesmal an einer zufälligen Stelle.
Nach ewigen debuggen kam ich auf den Pfad zu dem Problem:
Wird vom Dongle gelesen UND es ist gerade eine "Lastspitze" (Umfassreiche StringOperationen) im Hauptthread,
so geschieht der Absturz bzw. Fehler.
Die DongleRead Funktion wird von einer unmanaged DLL wie folgt importiert:
<DllImport("Sense_LC.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Private Function LC_read(ByVal handle As System.UInt32, ByVal block As Int32, _
ByVal buffer As Byte()) As Int32
End Function Die Funktion, welche die Dongle Read Funktion nützt ist nun in einem "endlosen" Backroundworker.
WAS fällt euch ein, um den Fehler entweder zu beseitigen, oder zumindest abzufangen?
Danke schonmal im Voraus | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Manfred X | Datum: 08.05.20 14:00 |
| Hallo!
Das Verhalten von "Dongle" kann ich nicht beurteilen.
Du bist Dir im klaren darüber, dass Strings in VB.Net unveränderlich sind?
Wie sind diese umfangreichen String-Operationen gestaltet?
Verwendest Du dafür die Stringbuilder-Klasse?
Die zweite Möglichkeit wäre, dass Dein Lese-"Buffer" im DongleRead überläuft. | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Seek1 | Datum: 08.05.20 15:02 |
| Das mit den Strings ist viel mid usw. aber auch Berechnnungen usw.
Läuft aber in einen anderen Thread ab.
Nein. Mit dem Buffer hat es nichts zu tun. Gerade probiert.
Wenn der Buffer zu klein ist, gibt die Funktion einen Fehlercode zurück.
Das blöde an der ganzen Geschichte:
Es funktioniert alles, bis auf das Lesen des Dongle.
Hier der Code:
Function DongleReadBlock(ByVal AccessLevel As Integer, ByVal Password As _
String, ByVal BlockNumber As Integer) As Byte()
Dim rev As Integer
Dim UserPassByteArray As Byte() = System.Text.Encoding.Default.GetBytes( _
Password)
Dim buffer(255) As Byte
DongleReadBlock = buffer 'For default
Dim LC2_Handle As System.UInt32 'lc_handle_t = UInt32
Try
For i As Integer = 0 To 255
rev = LC_open(DongleDeveloperID, i, LC2_Handle)
If rev = LC_SUCCESS Then
rev = LC_passwd(LC2_Handle, AccessLevel, UserPassByteArray) _
'0=Admin 1=User 2=Authentification
If rev = LC_SUCCESS Then
rev = LC_read(LC2_Handle, BlockNumber, buffer) 'KILL
' Read
If rev = LC_SUCCESS Then
LC_close(LC2_Handle)
Return buffer
Else
LC_close(LC2_Handle)
End If
Else
LC_close(LC2_Handle)
End If
Else
LC_close(LC2_Handle)
End If
Next i
Catch ex As Exception
frm_Main.WriteErrorString = "Dongle Error 3: " & ex.Message.ToString
LC_close(LC2_Handle)
End Try
Dim ClearBuffer(255) As Byte 'Deb
Return ClearBuffer
End Function Wenn ich den Code ohne Hintergrundauslastung laufen lasse, gibt es kein Problem :-/ | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Manfred X | Datum: 08.05.20 17:59 |
| Schau mal im Task-Manager von Windows unter Details
wie sich der Arbeitsspeicherbedarf, sowie die Zahl der
Threads, Handles und Benutzerobjekte Deines Prozesses
entwickeln. Eventuell werden Handles oder unverwaltete
Ressourcen nicht freigegeben.
Beitrag wurde zuletzt am 08.05.20 um 18:00:07 editiert. | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Seek1 | Datum: 08.05.20 18:38 |
| Nein.
Daran habe ich auch gedacht :-/
Bleiben stabil.
Es sieht so aus, als ob der "Lese" Zugriff des Dongles zu spät abgefragt wird.
Wenn ich den Dongle_Read auskommentiere, läuft alles wie am Spiess.
Die Frage ist, ob ich beim Import der DLL einen Fehler mache, oder wie ich dem MDA Fehler abfangen kann.
Ein ApplicationEvent mit "Handles Me.UnhandledException" macht schon mal nichts.
Habe jetzt mal eine "MiniApp" erstellt, die beim "Stresstest" genauso abkackt.
Falls Sie wer einsehen möchte:
https://www.ramser-elektro.at/wp-content/uploads/2020/05/LC_VB_NET_Demo.rar | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Kuno60 | Datum: 09.05.20 01:21 |
| Hallo,
ich weiß zwar nicht genau was dein Programm macht, aber einwas ist mir aufgefallen:
In der Schleife rufst du 256 mal LC_open auf. Schließt es aber nur bei Else oder im Fehlerfall. Es kann also vorkommen das LC_open aufgerufen wird ohne vorher LC_close aufzurufen. Das kann zu deinem gezeigten Fehler führen.
Ich würde es so schreiben:
Dim LC2_Handle As UInt32
Try
For i As Integer = 0 To 255
rev = LC_open(DongleDeveloperID, i, LC2_Handle)
If rev = LC_SUCCESS Then
rev = LC_passwd(LC2_Handle, AccessLevel, UserPassByteArray)
If rev = LC_SUCCESS Then
rev = LC_read(LC2_Handle, BlockNumber, buffer) 'KILL Read
If rev = LC_SUCCESS Then
Return buffer
End If
End If
End If
LC_close(LC2_Handle)
Next
Catch ex As Exception
MsgBox("Dongle Error 3: " & ex.Message.ToString)
Finally
If LC2_Handle <> 0 Then
LC_close(LC2_Handle)
End If
End Try | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Seek1 | Datum: 11.05.20 08:49 |
| Das Handle wurde in den aktuellen Versionen immer geschlossen.
Das hätte also schon gepasst.
Leider wird das Handle auch nicht auf 0 gesetzt.
Werde es trotzdem wie in deinem Beispiel lösen, da es lesbarer ist. | |
Re: FatalExecutionError oder Programmende mit InterOP DLL | | | Autor: Seek1 | Datum: 12.05.20 13:59 |
| Problem gefunden!
Das Handle muss vom Typ IntPtr sein.
Dazu war der Buffer wirklich auch noch zu klein :-O
1024 bytes reserviert und es geht :-D | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|