Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Exceptions (https://www.delphipraxis.net/22547-exceptions.html)

Pseudemys Nelsoni 19. Mai 2004 04:57


Exceptions
 
Delphi-Quellcode:
function ReadRegString(const KEY_NAME: HKEY; KeyPath, Key: string): string;
var
  KeyH : HKEY;
  dwLen : DWORD;
  value : string;
begin
  Result := '';
  if RegOpenKeyEx(KEY_NAME, PAnsiChar(KeyPath), 0, KEY_READ, KeyH) = ERROR_SUCCESS then
  Try
    Try
      dwLen := 0;
      if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, nil, @dwLen) = ERROR_SUCCESS then
      begin
        Setlength(value, dwLen - 1);
        if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, @value[1], @dwLen) = ERROR_SUCCESS then
          Result := value
        else Error(1);
      end
      else Error(1);
    except
      Error(1);
    end;
  Finally
    RegCloseKey(KeyH);
  end
end;

moin!

sind die "Try's" unnütz hier? ich weiss nämlich nicht ob es irgendeine api funktion gibt die eine exception auslöst :oops: Und nochwas dazu...wie man sieht steht da 3mal "Error(1);" je nachdem ob irgendwas von den 3 if anweisungen nicht geklappt hat soll halt der fehler "1" an eine funktion übergeben werden....kann man das auch ohne das man es direkt jeder if anweisung im else teil angeben muss? also nur 1mal?

alcaeus 19. Mai 2004 05:22

Re: Exceptions
 
Soviel ich weiß lösen WinAPI-Funktionen keine Exceptions aus, aber es gibt (meistens negative) Rückgabewerte, welche einen Fehler signalisieren. Mit Hilfe derer kannst du das Ganze steuern.
Bezüglich dem Error(1): Du könntest mit einer Booleanvariable arbeiten, aber ich verstehe nicht, was dich daran so stört.

negaH 19. Mai 2004 06:37

Re: Exceptions
 
Ich vermute das Error() selber eine Exception auslösst, und somit wären die try finallys nötig.
Der Code ansich ist Bulletproof und meiner Meinung nach ein guter Source.

Gruß hagen

Pseudemys Nelsoni 19. Mai 2004 06:51

Re: Exceptions
 
danke :)

MathiasSimmack 19. Mai 2004 07:27

Re: Exceptions
 
Ich persönlich habe Bedenken deswegen:
Zitat:

Zitat von Pseudemys Nelsoni
Delphi-Quellcode:
      if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, nil, nil, @dwLen) = ERROR_SUCCESS then
      begin
        Setlength(value, dwLen - 1);

Im PSDK wird gesagt, dass die benötigte Puffergröße in die dword-Variable geschrieben wird, wenn diese vorher mit einem Wert belegt war. Ob nun 0 oder 1, spielt keine Rolle. Das "NULL" im Text des PSDK entspricht ja dem "NIL" von Delphi:
Zitat:

If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data.
Da steht aber nicht so was wie
Zitat:

... and stores the size of the data, in bytes, in the variable [...] not including the last character
Ich würde den Puffer daher so lassen und bei Strings erst nach dem erfolgreichen Auslesen das letzte Zeichen entfernen. Oder evtl. prüfen ob das letzte Zeichen auch wirklich #0 ist.

MathiasSimmack 19. Mai 2004 07:35

Re: Exceptions
 
PS:
Zitat:

Zitat von Pseudemys Nelsoni
Und nochwas dazu...wie man sieht steht da 3mal "Error(1);" je nachdem ob irgendwas von den 3 if anweisungen nicht geklappt hat soll halt der fehler "1" an eine funktion übergeben werden....kann man das auch ohne das man es direkt jeder if anweisung im else teil angeben muss? also nur 1mal?

Du könntest intern mit einer bool-Variablen arbeiten, die du bei jedem Registry-Zugriff benutzt. Bspw.
Delphi-Quellcode:
boolRes := RegQueryValueEx(...) = ERROR_SUCCESS;
if(boolRes) then
begin
  { ... }
end;
Und am Ende, nach dem Schließen des Registryschlüssels, wertest du die Variable dann aus:
Delphi-Quellcode:
if(not boolRes) then Error(1);
Und IMHO ist zumindest dieses try/except überflüssig:
Code:
  Try
    [color=red]Try[/color]
      { ... }
    [color=red]except
      Error(1);
    end;[/color]
  Finally
    RegCloseKey(KeyH);
  end

Pseudemys Nelsoni 19. Mai 2004 07:55

Re: Exceptions
 
danke, besonders das letzte beispiel mit der booleschen variable hat mir geholfen ;)

MathiasSimmack 19. Mai 2004 08:09

Re: Exceptions
 
Ja, trotzdem noch eine Anmerkung: Du solltest die Typprüfung nicht vergessen:
Code:
if RegQueryValueEx(KeyH, PAnsiChar(Key), nil, [color=red]nil[/color], nil, @dwLen)
Im Moment kann man mit der Funktion auch alles andere auslesen, also DWORDS usw., und nicht bloß Strings. Es passiert zwar nichts, aber man sieht natürlich auch bloß wieder die "Vierecke", weil es sich eben nicht um einen String handelt. ;)

Pseudemys Nelsoni 19. Mai 2004 08:28

Re: Exceptions
 
danke, daran hatte ich (noch) nicht gedacht :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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-2025 by Thomas Breitkreuz