vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
FatalExecutionError 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 :-/
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: FatalExecutionError oder Programmende mit InterOP DLL 
Autor: Seek1
Datum: 08.05.20 21:04

So. Jetzt wird es happig.
Habe mal eine schnelle Geschichte in den Mainthread verschoben.
Siehe da: Der selbe S******.
Diesmal wird die Exception aber wenigstend richtig zugeordnet (nicht irgendwo).

Das Problem an der Geschichte ist, ohne Hardware Dongle ist der Code nicht debugbar.

Hier de ex:
https://www.ramser-elektro.at/wp-content/uploads/2020/05/Exception.jpg

Hier das Projekt:
https://www.ramser-elektro.at/wp-content/uploads/2020/05/LC_VB_NET_MainThreD.rar

An wen (welchen Instanz) soll ich mich wenden?
Hersteller (der Dongle) wird auf seine Uralt Projekte verweisen .....

SDK ist übrigens auch downloadbar:
http://www.senselock.com/uploads/file/LC/Clave2%20Basic_v2.2.2.2.zip

Programmiert mit der 32bit X86 API DLL (LC.DLL)

Habe auch die LC_sense.dll vom C# Sample probiert -> Selbes Problem

Ich bin mir sicher, dass das Problem mit C# genauso besteht
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel