Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi AV beim Lesen eines Strings aus Registry mit RegQueryValueEx (https://www.delphipraxis.net/44366-av-beim-lesen-eines-strings-aus-registry-mit-regqueryvalueex.html)

Luckie 18. Apr 2005 15:30


AV beim Lesen eines Strings aus Registry mit RegQueryValueEx
 
Ich benutze folgenden Code, um einen String aus der Registry zu lesen:
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);
  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;
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:

Bernhard Geyer 18. Apr 2005 15:33

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
 
Lass einfach die harte Typwandlung weg
Delphi-Quellcode:
Value := Buffer;
Delphi schafft es auch so.

Waldteufel 18. Apr 2005 15:37

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
 
Hi.

Delphi schafft es nur so... ;-)

Luckie 18. Apr 2005 15:38

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).

Basilikum 18. Apr 2005 16:00

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;

Luckie 18. Apr 2005 16:03

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;

Basilikum 18. Apr 2005 16:20

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
 
Zitat:

Zitat von Luckie
Hast du jetzt irgendwas geändert? Ich verstehe deinen Kommentar nicht. :gruebel:

neee... habe nichts geändert.... die WinAPI hat wohl, je nach Wert von cbData mehr oder weniger vom String-Pointer überschrieben (insofern in das String-Handling eingegriffen)...
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....

Luckie 18. Apr 2005 16:47

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal
 
Zitat:

Zitat von Basilikum
die WinAPI hat wohl, je nach Wert von cbData mehr oder weniger vom String-Pointer überschrieben

Nein das war es wohl eher nicht. Buffer ist ein Array auf eine Zeichenfolge und da hat einfach nur der Index [0] gefehlt, damit er weiß an welcher Stelle das erste Zeichen steht.

shmia 18. Apr 2005 16:50

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;

Luckie 18. Apr 2005 17:09

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:

[Error] MpuRegistry.pas(84): Incompatible types: 'Char' and 'Byte'
Außerdem weiß ich so, was ich mache.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.
Seite 1 von 2  1 2      

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