 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 26.07.2008, 11:46 Titel: Exception Handling |
|
|
Hallo! Ich hasse es, wenn irgendwo eine Access Violation auftritt und dann das Programm abschmiert. Ich will aber auch nicht das QBlike Error Handling verwenden, sondern Windows eine eigene Fehlerbehandlungsroutine schmackhaft machen. Nur wie? Die win32.hlp bezieht sich nur auf Win32-C-Compiler mit "try .. except .. finally". Gibt es nicht eine WinAPI-Funktion, die einen Exception Handler festlegt oder so?
mfG Cherry |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2008, 08:27 Titel: |
|
|
Danke, hab es schon selbst herausgefunden:
Code: |
#include "windows.bi"
Dim Shared testptr As UInteger Ptr
Dim Shared test As UInteger
Function ExceptionHandler Cdecl (_exception As EXCEPTION_RECORD Ptr, _errstruct As UInteger Ptr, _context As CONTEXT Ptr) As Integer
Dim As UInteger _param = _errstruct[2]
Dim As UInteger _code, _flag, _adress, _write, _dest
' Laden der Informationen
Asm
mov edx, [_exception]
push [edx]
push [edx+4]
push [edx+12]
cmp dword ptr [edx+16], 2
jnz _el1
push [edx+20]
push [edx+24]
jmp _el2
_el1:
push 0
push 0
_el2:
pop [_dest]
pop [_write]
pop [_adress]
pop [_flag]
pop [_code]
End Asm
Dim ret As UInteger
' Behandlung des Fehlers, je nach Kontext (_param)
Select Case _param
Case 0
MessageBox(NULL, "Fehler " & Hex(_code) & " in Code Block 1 (Adresse " & Hex(_adress) & "!", "Fehler", 0)
ExitProcess(1)
Case 1
MessageBox(NULL, "Fehler " & Hex(_code) & " in Code Block 2 (Adresse " & Hex(_adress) & "!", "Fehler", 0)
ExitProcess(2)
End Select
Return ret
End Function
#Macro GuardedCode_Start(_param)
Asm
push _param
push Offset ExceptionHandler
push fs:[0]
mov fs:[0], esp
End Asm
#EndMacro
#Macro GuardedCode_End()
Asm
pop fs:[0]
add esp, 8
End Asm
#EndMacro
' Test code
' Code Block 1
GuardedCode_Start(0)
' Zugriff auf Nullpointer
*testptr = 5
GuardedCode_End()
' Code Block 2 (nie ausgeführt)
GuardedCode_Start(1)
Dim x As Byte Ptr
' Zugriff auf Nullpointer
*x = 0
GuardedCode_End()
|
|
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 16.08.2009, 18:20 Titel: |
|
|
Sehr interessant, sollte vll. mal nach FBP bewegt werden.
Habs gerade in einem meiner Programme eingesetzt... naja hat mir nicht geholfen zu verstehen, warum SHGetSpecialFolderLocation ne Access Violation wirft... |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|