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:
//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.
Mit SafeCall kannst du auch deine eigenen Fehlercodes mitgeben. Aber dazu bräuchte ich jetzt doch mal ein Delphi.
Es müsste in etwa so gehen:
Delphi-Quellcode:
//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.
Edit: Korrektur: Fehlercode muss negativ sein.
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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.