AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi AV beim Lesen eines Strings aus Registry mit RegQueryValueEx
Thema durchsuchen
Ansicht
Themen-Optionen

AV beim Lesen eines Strings aus Registry mit RegQueryValueEx

Ein Thema von Luckie · begonnen am 18. Apr 2005 · letzter Beitrag vom 19. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AV beim Lesen eines Strings aus Registry mit RegQueryValueEx

  Alt 18. Apr 2005, 15:30
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. Integer lesen geht problemlos, wenn ich Buffer als Integer deklariere, lesen. Wo steckt da jetzt schon wieder der Teufel?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 15:33
Lass einfach die harte Typwandlung weg
Value := Buffer; Delphi schafft es auch so.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#3

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 15:37
Hi.

Delphi schafft es nur so...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 15:38
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).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 16:00
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 16:03
Hast du jetzt irgendwas geändert? Ich verstehe deinen Kommentar nicht.

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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#7

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 16:20
Zitat von Luckie:
Hast du jetzt irgendwas geändert? Ich verstehe deinen Kommentar nicht.
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....
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 16:47
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 16:50
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: AV beim Lesen eines Strings aus Registry mit RegQueryVal

  Alt 18. Apr 2005, 17:09
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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