AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exit-Funktion erweitern

Ein Thema von Desmulator · begonnen am 20. Mai 2009 · letzter Beitrag vom 20. Mai 2009
Antwort Antwort
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#1

Exit-Funktion erweitern

  Alt 20. Mai 2009, 08:31
Guten Morgen zusammen,

zur Zeit arbeite ich intensiv mit DLLs und habe deshalb eine GetLastError-Funktion. Diese wird natürlich mit eine SetLastError-Funktion intern gefüttert. Jetzt bin ich aber an einem Punkt, andem soetwas wie eine Exit-SetLastError-Funktion nützlich wäre. Also die ErrorVariable gesetzt wird und die Funktion beendet. Prinzipiell müsste ich doch einfach nur den Stack soweit zurück springen bis ich wieder beim Caller bin.

Beispiel:
Delphi-Quellcode:
// In der DLL
function ReadAll(Stream : TMyStream) : PChar; stdcall;
begin
  // LastError wird zu INVALID_PARAM, Result = nil, Ausgang von ReadAll
  if Stream = nil then SetLastErrorExit(BASE_ERR_INVALID_PARAM, nil)
  else begin
    ..
  end;
end;

// Im Programm
function Test() : Boolean;
var
  Stream : TMyStream;
begin
  Stream := TMyStream.Create; // Beispiel
  // Ich rufe eine Funktion meiner DLL auf
  if ReadAll(Stream) = nil then ShowMessage(Format('Fehler: %d', [GetLastError]));
  Stream.Free;
end;
Ist sowas möglich? Naja warscheinlich schon, allerdings sehr unsauber oder?

Mfg Desmu
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Exit-Funktion erweitern

  Alt 20. Mai 2009, 08:35
Zum einen ist mir nicht bekannt, das Strings nil sein können (das C NULL wäre hier ''). Außerdem finde ich wäre es wohl besser, wenn du kritische Blöcke mit try ... except umfasst und dort die Fehler abfängst mithilfe von Exceptions und nicht mit Error-Meldungen um dich schmeißt, weil du da mal ganz schnell auch Windows-Fehler die für dich von Bedeutung sein könnten untergraben wirst.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#3

Re: Exit-Funktion erweitern

  Alt 20. Mai 2009, 08:40
Zitat von quendolineDD:
Zum einen ist mir nicht bekannt, das Strings nil sein können (das C NULL wäre hier ''). Außerdem finde ich wäre es wohl besser, wenn du kritische Blöcke mit try ... except umfasst und dort die Fehler abfängst mithilfe von Exceptions und nicht mit Error-Meldungen um dich schmeißt, weil du da mal ganz schnell auch Windows-Fehler die für dich von Bedeutung sein könnten untergraben wirst.
Es ging mir hierbei auch eher um eine Beispiel der Verwendung einer solchen Funktion. Ich hab jetzt mal das String durch PChar ersetzt. try..except-Blöcke brauche ich afaik nicht, da ich einfach mal behaupte, dass TMyStream eine eigene Klasse ist und keine Exception wirft. Es geht auch mehr darum, dass in einer DLL-Funktion schlecht Exception geworfen werden können. Deshalb führe ich in der DLL eine SetLastError-Funktion ein und exportiere eine GetLastError-Funktion.

Meine Frage ist jetzt, ob es nicht möglich wäre, eine Funktion zum beenden des Aufrufs, wie oben zu erstellen, in der LastError gesetzt wird, ein Rückgabewert gesetzt werden kann und die Funktion, die Aufgerufen wurde beendet wird.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: Exit-Funktion erweitern

  Alt 20. Mai 2009, 11:26
Zitat von Desmulator:
Ich hab jetzt mal das String durch PChar ersetzt.
Wer gibt den PChar frei? Zeigt der PChar vielleicht noch auf einen temporären String der auf dem Stack liegt und somit beim Rücksprung nicht mehr gültig ist? Lauter Fragen, die du dir beantworten solltest.

Zitat:
Meine Frage ist jetzt, ob es nicht möglich wäre, eine Funktion zum beenden des Aufrufs, wie oben zu erstellen, in der LastError gesetzt wird, ein Rückgabewert gesetzt werden kann und die Funktion, die Aufgerufen wurde beendet wird.
Wenn du deine Funktion mit der cdecl Aufrufkonvention deklarierst, keine managed Datentypen (String, dyn. Array, Variant, Interface) und keine try-Blöcke verwendest, dann könnte man da schon was mit Assembler-Code machen. Aber ich bezweifle dass das dem Code gut täte.
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#5

Re: Exit-Funktion erweitern

  Alt 20. Mai 2009, 12:53
Zitat von jbg:
Wenn du deine Funktion mit der cdecl Aufrufkonvention deklarierst, keine managed Datentypen (String, dyn. Array, Variant, Interface) und keine try-Blöcke verwendest, dann könnte man da schon was mit Assembler-Code machen. Aber ich bezweifle dass das dem Code gut täte.
Okay, sauber wird es wohl nie sein, und einbauen werde ich es wohl auch kaum, aber mich würde einfach aus reiner interesse interessieren wie das geht.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz