![]() |
AW: eigene Fehlercodes als Rückgabewert definieren
Die Klassen arbeiten nur innerhalb der DLL. Die Kommunikation zwischen Anwendung und DLL erfolgt über ganz normale Funktionen.
|
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
Gegenfrage: -In welcher Reihenfolge werden die Funktionen aufgerufen? (links nach rechts? rechts nach links?) -Werden alle Funktionen aufgerufen? (Stichwort: Compilerschalter) Beispiel für ein schlechtes Beispiel gefällig? Code, dessen Funktionsweise von Compilerschaltern und der Sprachenphilosophie abhängt! ;-) Sechs, setzen. Na, sagen wir: Vier miiinus. |
AW: eigene Fehlercodes als Rückgabewert definieren
Die Funktionen werden von Links nach Rechts aufgerufen.
Und ja, das ganze ist vom Compilerschalter abhängig. Ebenso wie viele Funktionen in der Unit SysUtils. Somit ist das ganze an einen Compilerschalter gebunden der nahezu immer notwendig ist. Ich würde es auch nicht generell verurteilen Quelltext an Compilerschalter anzupassen. Ich würde das eher Optimierung nennen. Zum Beispiel knallt folgender Quelltext bei einem Leerstring wenn die Bereichsprüfung an ist weil angeblich auf Index 1 des Strings zugegriffen wird (was durch die Lengthangabe aber nicht stört)
Delphi-Quellcode:
Jetzt könnte man da eine Prüfung der Länge davor setzen aber warum eine zusätzliche Anweisung einbauen die bei einem selbst nicht notwendig ist.
move(LeerString[1], MyBuffer[0], Length(LeerString));
Also bitte keine 4- sondern eine 3+ ;-) |
AW: eigene Fehlercodes als Rückgabewert definieren
Wenn du über DLL-Grenzen hinwegarbeitest bietet sich die Aufrufkonvention "SafeCall" an. SafeCall gibt immer zusätzlich zum eigentlichen Rückgabewert einen zweiten Rückgabewert vom Typ HResult mit. Und die Logik dahinter macht Delphi automatisch,
Ich hab grad kein Delphi hier um das nochmal zu testen, aber folgendes sollte funktionieren (auch über DLL-Grenzen hinweg):
Delphi-Quellcode:
Mit SafeCall kannst du auch deine eigenen Fehlercodes mitgeben. Aber dazu bräuchte ich jetzt doch mal ein Delphi.
//in DLL
function myDiv(a,b:Integer):Integer;safecall; begin if b<>0 then result:=a div b else raise Exception.create('Du Idiot, wenn man durch null teilt, landet man beim schwarzen Mann.'); end; //in Exe function mydiv(a,b:Integer):Integer; safecall; external myDLL; begin try mydiv(4,0); except on E:Exception do showmessage(e.MEssage); //ich glaube Delphi kriegt die Message nicht wirklich durch, aber schau mal. end; end. Es müsste in etwa so gehen:
Delphi-Quellcode:
Edit: Korrektur: Fehlercode muss negativ sein.
//in DLL
function myDiv(a,b:Integer;out res:Integer):HResult;stdcall; //dies entspricht derselben Aufrufkonvetnion wie oben begin if b<>0 then begin res:=a div b; result:=s_ok; end else begin res:=0; //ist egal result:=-80; // lustiger Fehlercode, muss negativ sein (bzw. MSB muss gesetzt sein) end; end; //der Exe-Teil sollte genau gleich aussehen (auch mit safecall) //die Exception wirft das Hauptprogramm automatisch, wenn der Fehlercode bestimmte Werte annimmt, ich hoffe die 80 reicht dazu. Als Ergänzung kannst du in der Exe, sofern du kein ActiveX nutzt (also unit comobj nicht einbindest), die globalew Variable SafeCallErrorProc umsetzen:
Delphi-Quellcode:
procedure SafeCallError(ErrorCode: Integer; ErrorAddr: Pointer);
var adr:Pointer; begin raise Exception.Create('Fehlercode' + inttostr(ErrorCode) ); end; initialization SafeCallErrorProc:=@SafeCallError; |
AW: eigene Fehlercodes als Rückgabewert definieren
Zitat:
Wenn du dir StrToInt anguckst, wirst du eine Exception bekommen, wenn du irgendwas merkwürdiges Konvertieren willst. In beiden Fällen gibt es keine Fehlerrückgabewerte (es sei denn man missbraucht IntToStrDef dazu, indem man einen ungewöhnlichen Defaultwert angibt). Die Diskussion mit der Geschwindigkeit gab es hier auch schon mal, dabei kam afaik heraus, dass Try-Except wenig kostet, solange keine Exceptions auftreten (dann ist eh was falsch gelaufen). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz