Entwickler-Ecke

Windows API - Problem mit RegQueryValueEX


tmtmtm - Do 21.11.02 18:47
Titel: Problem mit RegQueryValueEX
Hallo zusammen!

Auch mal wieder da...


Und zwar gibts folgendes Problem:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
LONG RegQueryValueEx(

    HKEY hKey,  // handle of key to query 
    LPTSTR lpValueName,  // address of name of value to query 
    LPDWORD lpReserved,  // reserved 
    LPDWORD lpType,  // address of buffer for value type 
    LPBYTE lpData,  // address of data buffer
    LPDWORD lpcbData   // address of data buffer size 
   );


Ich bekomme diesen Registry-Befehl zum Zeichenketten auslesen nicht hin.
Mein spezielles Problem mit der Geschichte besteht bei "LPBYTE lpData".
Wie soll ich denn von einem Zeiger, der nur auf einzelne BYTE-Elemente zeigen kann, auf einen Buffer (sprich Feld von z.B. 2048 Byte) zeigen lassen? Denn ein Puffer für den Stringwert der Registry sollte doch schon größer als 1 Byte sein. ( :?: )

Aber wie soll ich diesen String mit so einem Zeigertyp in ein ganzes Feld bringen???
Ich bin am Verzweifeln!!! :(

Also Leute, wenn ihr das wisst. :arrow: Raus damit!

Ach so:
Bitte keine TRegistry-Vorschläge. Brauche die API unbedingt.


D a N k E s C h Ö n!!!

MfG Thomas


Delete - Do 21.11.02 19:39

Folgende Funktion stammt von NicoDE. Nimm´s als Anregung:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
function ReadString(RootKey: HKEY; RegKey, RegVal: string) : string;
var
  SubKey : array [0..80] of char;
  rgHandle : HKEY;
  lpType, cbData : DWORD;
begin
  Result := ''; fillchar(SubKey, sizeof(SubKey), 0);

  lstrcpy(SubKey, pchar(RegKey));

  rgHandle := 0;
  if(RegOpenKeyEx(RootKey,SubKey,0,KEY_QUERY_VALUE,rgHandle) = ERROR_SUCCESS) then
    try
      lpType := REG_NONE;
      cbData := 0;

      if(RegQueryValueEx(rgHandle,pchar(RegVal),nil,@lpType,nil,@cbData) = ERROR_SUCCESS) and
        ((lpType = REG_SZ) or (lpType = REG_EXPAND_SZ)) and
        (cbData > 1) then
      begin
        SetLength(Result, cbData);
        if(RegQueryValueEx(rgHandle,pchar(RegVal),nil,
          nil,@Result[1],@cbData) = ERROR_SUCCESS) then SetLength(Result, cbData - 1)
        else Result := '';
      end;
    finally
      RegCloseKey(rgHandle);
    end;
end;


Delete - Do 21.11.02 19:45

Ach du meine Güte, wie kannst du den armen Code von Nico vorsetzen? :shock:

Obwohl, was die Fehlerbehandlung angeht, nimmt es Nico immer sehr genau. Ich wünschte da würde ich auch mal hinkommen. :?


tmtmtm - Do 21.11.02 19:56
Titel: Dankeschön...
Danke Leute!

Mal reinfitzeln...

Hätte ja auch fast nix anderes erwartet.
!!!HIGHLY PROFESSIONAL!!! :shock:

Schönen Abend noch! Und grübelt nicht mehr so viel. *g*

THX T.M.


Delete - Fr 22.11.02 08:29

Luckie hat folgendes geschrieben:
Ach du meine Güte, wie kannst du den armen Code von Nico vorsetzen?

Na, so schlimm ist speziell dieser Code ja nun nicht. Das Verständnis kriegt man auch mit dem geringen Wissen hin, das ich besitze.

Zitat:
Obwohl, was die Fehlerbehandlung angeht, nimmt es Nico immer sehr genau.

Ist eigentlich immer empfehlenswert, ob nun mit oder ohne VCL. Du selbst schimpfst ja auch in einigen Beiträgen über den Ressourcenschutz usw.