AV beim Lesen eines Strings aus Registry mit RegQueryValueEx
Ich benutze folgenden Code, um einen String aus der Registry zu lesen:
Delphi-Quellcode:
An der markierten Stelle bekomme ich leider immer eine AV. :wall: Integer lesen geht problemlos, wenn ich Buffer als Integer deklariere, lesen. Wo steckt da jetzt schon wieder der Teufel? :gruebel:
function TMpuRegistry.ReadString(const ValueName: string; var Value: string):
LongInt; var cbData: Integer; lpType: DWORD; Buffer: PChar; begin // get size of required data result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, @Value, @cbData); if cbData <> 0 then begin GetMem(Buffer, cbData); try result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, @Buffer, @cbData); Value := string(Buffer); // <- hier AccessViolation finally FreeMem(Buffer); end; end; end; |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Lass einfach die harte Typwandlung weg
Delphi-Quellcode:
Delphi schafft es auch so.
Value := Buffer;
|
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Hi.
Delphi schafft es nur so... ;-) |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Nein, das war es nicht. Beim Debuggen wird mir kein Hint angezeigt, wenn ich mit der Maus auf die variable Buffer zeige. Result ist aber 0 (= ERROR_SUCCESS).
|
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Delphi-Quellcode:
function TMpuRegistry.ReadString(const ValueName: string; var Value: string):
LongInt; var cbData: Integer; lpType: DWORD; Buffer: PChar; begin // get size of required data result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, @Value, @cbData); // Delphi mag es nicht, wenn man ihm beim String-Handling dazwischenpfuscht (@Value)........ :-) if cbData <> 0 then begin GetMem(Buffer, cbData); try result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, @Buffer, @cbData); Value := string(Buffer); // <- hier AccessViolation finally FreeMem(Buffer); end; end; end; |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Hast du jetzt irgendwas geändert? Ich verstehe deinen Kommentar nicht. :gruebel:
Habs:
Code:
function TMpuRegistry.ReadString(const ValueName: string; var Value: string):
LongInt; var cbData: Integer; lpType: DWORD; Buffer: PChar; begin // get size of required data result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, nil, @cbData); if cbData <> 0 then begin GetMem(Buffer, cbData); try result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, @Buffer[u][b][0][/b][/u], @cbData); Value := Buffer; // <- hier AccessViolation finally FreeMem(Buffer); end; end; end; |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Zitat:
und bei der Zuweisung Value := Buffer; hat dann der Compiler die reguläre String-Freigabe eingefügt, die dann wiederum auf einer empirischen Speicheradresse stattgefunden hat... aber beim 2. Mal lesen meines Kommentares musste ich auch feststellen, dass er nicht gerade aussagekräftig ist.... |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Zitat:
|
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Dieses Beschaffen von Speicher mit GetMem ist doch überflüssig.
Delphi-Quellcode:
function TMpuRegistry.ReadString(const ValueName: string; var Value: string):
LongInt; var cbData: Integer; lpType: DWORD; begin // get size of required data result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, nil, @cbData); if Result=ERROR_SUCCESS then begin SetLength(Value, cbData); // Speicherplatz im Ausgabestring reservieren result := RegQueryValueEx(FhkResult, PChar(ValueName), nil, @lpType, PChar(Value), @cbData); end; end; |
Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
Aber so wie du es machst geht es nicht. Letzte Zeile beo PChar(Value):
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 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