Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registry: Typ ermitteln (https://www.delphipraxis.net/22551-registry-typ-ermitteln.html)

Pseudemys Nelsoni 19. Mai 2004 16:21

Re: Registry: Typ ermitteln
 
wäre dieser code hier denn in ordnung?

Delphi-Quellcode:
function ReadRegFromAPI(const Key: HKEY; Path, lpValueName: string): string;
var
  KeyH    : HKEY;
  lpType,
  lpcbData,
  lpData  : DWORD;
  bRes    : boolean;
begin
  Result := '';
  if RegOpenKeyEx(Key, PAnsiChar(Path), 0, KEY_READ, KeyH) = ERROR_SUCCESS then
  try
    lpType := REG_NONE;
    lpcbData := 0;
    bRes := false;
    if RegQueryValueEx(KeyH, PAnsiChar(lpValueName), nil, @lpType, nil, @lpcbData) = ERROR_SUCCESS then
    case lpType of
      REG_SZ, REG_EXPAND_SZ:
        begin
          SetLength(Result, lpcbData + 1);
          bRes := RegQueryValueEx(KeyH, PAnsiChar(lpValueName), nil, @lpType, @Result[1], @lpcbData) = ERROR_SUCCESS;
        end;
      REG_DWORD:
        begin
          bRes := RegQueryValueEx(KeyH, PAnsiChar(lpValueName), nil, @lpType, @lpData, @lpcbData) = ERROR_SUCCESS;
          Result := string(lpData);
        end;
    end;
  finally
    if not bRes then
      MessageBox(0, 'Fehler aufgetreten', '!', 0);
    RegCloseKey(Key);
  end;
end;

und wieso muss ich bei einem string auf das erste byte zeigen? also [1] ? bei einem integer sind es doch auch 4 bytes, wieso muss ich da nicht [1] angeben?

Chewie 19. Mai 2004 16:30

Re: Registry: Typ ermitteln
 
Die Funktion erwartet einen Zeiger auf ein Zeichen. String[1] ist dein erstes Zeichen, und mit @String[1] lieferst du einen Zeiger auf das erste Zeichen.

MathiasSimmack 19. Mai 2004 16:40

Re: Registry: Typ ermitteln
 
Mitnichten erwartet die Funktion einen Zeiger auf ein Zeichen. Tatsächlich erwartet sie einen Zeiger auf einen Puffer, der die gewünschten Daten aufnehmen soll. Im Fall eines REG_SZ/REG_EXPAND_SZ ist das entweder ein pchar, ein "array of char" oder eben ein String.
Und da hängt es dann eben vom Typ ab. Da ein String im 0. Zeichen die Länge hat, muss man eben die [1] separat angeben.

Es kann aber auch ein DWORD sein, dann wäre es eben ein Zeiger auf die DWORD-Variable, so wie das Pseudemys Nelson auch gemacht hat. Nur wäre
Delphi-Quellcode:
Result := inttostr(lpData);
wohl sinnvoller als
Zitat:

Delphi-Quellcode:
Result := string(lpData);

;)

Pseudemys Nelsoni 19. Mai 2004 16:51

Re: Registry: Typ ermitteln
 
hallo chewie/mathias, danke für die erklärung :)

2 Fragen stellen sich aber wieder mal :thuimb:

also zur ersten...

ich glaube das "SetLength(Result, lpcbData + 1);" von mir falsch war, denn selbst mit "SetLength(Result, lpcbData - 2);" bekomme ich noch das richtige Ergebnis! oder täusch ich mich da? habs jedenfalls getestet und die showmessage zeigte den gesamten string an.

zur zweiten...

mathias, ich arbeite ohne die vcl, da ich eine dll schreibe, sollte nicht all zu gross werden :\
hast du da noch ne andere idee?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.
Seite 2 von 2     12   

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