Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: eigene Fehlercodes als Rückgabewert definieren

  Alt 12. Jul 2011, 16:02
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.

Geändert von sirius (12. Jul 2011 um 22:41 Uhr)
  Mit Zitat antworten Zitat