![]() |
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? |
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.
|
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:
wohl sinnvoller als
Result := inttostr(lpData);
Zitat:
|
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. |
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