AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Registry auslesen unsicher

Ein Thema von HomerGER · begonnen am 9. Jun 2003 · letzter Beitrag vom 11. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#1

Registry auslesen unsicher

  Alt 9. Jun 2003, 00:55
hallo ich hab mir ein Function zusammengebaut
sie funktiniert auch soweit nur bei multisz bin ein bischen unsicher
zwar lese ich nur bin, dw, sz und multi aus aber ganz wohl bin ich bei der sache nicht
ich habe den multi jetzt bei unbekannt eingesetzt
aber das ist zu unsicher
kann mir jemand sagen wie ich das besser machen kann ?

//Type (öffentlich)
type
reg1_r = Record
s1 : HKEY;
s2 : String;
s3 : String;
end;
Code:
//******************************************************************************
//ÜbergabeFunction
//Wert Reg aus der Registry lesen
Function Reg_Lesen_RYU(input_r : reg1_r) : reg_wert_r;
const bufsize = 100;
var
Reg : TRegistry;
output_s : String;
string_s : String;
integer_i : Integer;
byte_buffer_dab : Array of Byte;
byte_ausgabe_s : String;
byte_size_i : integer;
byte_len_i : Integer;
i : Integer;
multi_type_c: Cardinal;
multi_size_c: Cardinal;
multi_str_s: String;
begin
    Reg := TRegistry.Create;
    output_s := '';
    string_s := '';

    try
        //HKEY lesen
        Reg.RootKey := input_r.s1;

        //Schlüssel lesen
        if not Reg.OpenKey(input_r.s2, False) then
        begin
            //Kein Schlüssel vorhanden
            output_s := 'nokey';
            Result.s1 := output_s;
            Result.s2 := '';
        end
        else
        begin
            //Wert lesen
            if Reg.ValueExists(input_r.s3) = False then
            begin
                 //Kein Wert vorhanden
                output_s := 'novalue';
                Result.s1 := output_s;
                Result.s2 := '';
            end
            else
            begin
            //String
                if (Reg.GetDataType(input_r.s3) = rdString) then
                begin
                    string_s := Reg.readstring(input_r.s3);
                    Result.s1 := 'sz';
                    Result.s2 := string_s;
                end
            //Integer
                else if (Reg.GetDataType(input_r.s3) = rdInteger) then
                begin
                    integer_i := Reg.readinteger(input_r.s3);
                    Result.s1 := 'dw';
                    Result.s2 := IntToStr(integer_i);
                end
            //Binary
                else if (Reg.GetDataType(input_r.s3) = rdBinary) then
                begin
                    SetLength(byte_buffer_dab, byte_size_i);

                    byte_len_i := Reg.ReadBinaryData(input_r.s3, PChar(byte_buffer_dab)^, byte_size_i);

                    byte_ausgabe_s := '';
                    for i := 0 to byte_len_i - 1 do
                    begin
                        if Length(IntToStr(byte_buffer_dab[i])) = 1 then
                        begin
                            byte_ausgabe_s := byte_ausgabe_s + '0' + IntToStr(byte_buffer_dab[i]);
                        end
                        else
                        begin
                            byte_ausgabe_s := byte_ausgabe_s + IntToStr(byte_buffer_dab[i]);
                        end;
                    end;
                    Result.s1 := 'bi';
                    Result.s2 := byte_ausgabe_s;
                end
            //Erweiterter String
                else if (Reg.GetDataType(input_r.s3) = rdExpandString) then
                begin
                    string_s := Reg.readstring(input_r.s3);
                    Result.s1 := 'es';
                    Result.s2 := string_s;
                end
            //Mehrzeiliger String
                else if (Reg.GetDataType(input_r.s3) = rdUnknown) then
                begin
                    multi_size_c := 0;
                    RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, nil, @multi_size_c);
                   
                    SetLength(multi_str_s, multi_size_c - 1);
                    if multi_size_c > 1 then
                    begin
                    RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, PByte(multi_str_s), @multi_size_c);
                    end;
                   
                    for i := Length(multi_str_s) downto 1 do
                    begin
                        if multi_str_s[i] = #0 then
                        begin
                            multi_str_s[i] := #13;
                        end;
                    end;
                    if (multi_str_s <> '') then
                    begin
                        Result.s1 := 'mz';
                        Result.s2 := multi_str_s;
                    end;
                end
            //Fehler
                else
                begin
                    //Fehler kein Typ gefunden
                end;
            end;
        Reg.CloseKey;
        end;
    finally
    Reg.Free;
    end;
end;
der teil um den es mir geht ist der hier
//Mehrzeiliger String
else if (Reg.GetDataType(input_r.s3) = rdUnknown) then
begin
multi_size_c := 0;
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, nil, @multi_size_c);

SetLength(multi_str_s, multi_size_c - 1);
if multi_size_c > 1 then
begin
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, PByte(multi_str_s), @multi_size_c);
end;

for i := Length(multi_str_s) downto 1 do
begin
if multi_str_s[i] = #0 then
begin
multi_str_s[i] := #13;
end;
end;
if (multi_str_s <> '') then
begin
Result.s1 := 'mz';
Result.s2 := multi_str_s;
end;
end
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 9. Jun 2003, 01:17
Moin HomerGER,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Wenn Du allgemein Daten aus der Registry auslesen willst, also auch über die von TRegistry unterstützten hinaus, halte ich es für sinnvoller dies direkt mit den API Funktionen zu tun, da TRegistry nur REG_SZ, REG_EXPAND_SZ, REG_BINARY, REG_DWORD und den Rest unterscheidet. Der Rest umfasst aber nicht nur REG_MULTI_SZ, so dass im Falle eines rdUnknown nicht sichergestellt ist, dass es sich um ein REG_MULTI_SZ handelt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#3
  Alt 9. Jun 2003, 13:42
Danke für die nette begrüssung
also mit den api functionhab ich es schon versucht
Delphi-Quellcode:
if (RegOpenKeyEx(input_r.s1, PChar(input_r.s2), 0, KEY_READ, key) = ERROR_SUCCESS) then
            begin

                RegQueryValueEx(key, PChar(input_r.s3), nil, @vType, nil, @vLen);
                ShowMessage(inttostr(vType));
            end;
nur das ist merkwürdige das er nicht alle registry einträge erkennt
ich lese so 100 werte aus
er kennt aber nur 10, zwar richtig, aber leider nur die paar
die werte sie alle da
mit Reg.GetDataType erkennt er alle
hast du ne idee ?

Ps und habe ich
if (Reg.GetDataType(input_r.s3) = rdBinary) gegen
if (vType = REG_SZ) usw getauscht
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 9. Jun 2003, 17:41
Moin HomerGER,

hast Du Dir vorher auch mit RegQueryInfoKey die "Eckdaten" des Keys geholt?
Und hast Du daran gedacht, dass der letzte Parameter von RegQueryValueEx immer wieder neu gesetzt werden muss, da das Auslesen den Inhalt verändert?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#5
  Alt 9. Jun 2003, 17:59
hi Christian

Zitat:
Und hast Du daran gedacht, dass der letzte Parameter von RegQueryValueEx immer wieder neu gesetzt werden muss, da das Auslesen den Inhalt verändert?
da das eine Function ist werden die daten ja immer wieder neu geholt
Zitat:
hast Du Dir vorher auch mit RegQueryInfoKey die "Eckdaten" des Keys geholt?
reicht es nicht wenn ich prüfe ob der key ofen ist ?

öffne ich als erste HKEY
dann prüfe ich ob der SubKey vorhanden ist
und dann prüfe ich ob ein wert vorhanden ist - und hier frage ich nach den datatype

Hast du womöglich ein Beispiel ?
da die meisten Function sich auf die Delphi Function beziehen und nicht auf die API ist es für mich ein bischen schwierig - ich weiß nicht recht ob ich es alles richtig verstehe

meine Function gib als erstes den datatyp zurück dw,sz usw
und dann den wert als string
so ist es mir (wenn ich den DataType richtig auslese) möglich ohne in die registy zu gehen die daten zu lesen und dann zu schreiben ohne zu wissen welche datatype ich da habe
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 9. Jun 2003, 19:46
Moin HomerGER,

Zitat von HomerGER:
da das eine Function ist werden die daten ja immer wieder neu geholt
nein, die Längenangabe wird nicht nur zurückgegeben, sondern man übergibt der Funktion damit auch zur Verfügung stehende Buffergrösse.
Deshalb muss der Wert immer wieder auf die Buffergrösse gesetzt werden.

Mit RegQueryInfoKey brauchst Du, u.a., um die erforderlichen Buffergrössen zu ermitteln.

Was Beispiele angeht:
Sollest Du, wieder erwarten, hier nichts passendes über die Suchfunktion ermitteln können, so kannst Du mal einen Blick in die RegTreeView Kompo werfen, die es hier zum Download gibt. Da hab' ich das mit Sicherheit verwendet.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#7
  Alt 9. Jun 2003, 20:10
Hi Christian
ich wäre ja froh wenn ich so weit wäre
ich hab hier mal angefangen
Delphi-Quellcode:
Function Reg_Lesen_RYU(input_r : reg1_r) : reg_wert_r;
var
key_hk : HKEY;
begin
    try
        if (RegOpenKeyEx(input_r.s1, PChar(input_r.s2), 0, KEY_READ, key_hk) = ERROR_SUCCESS) then
        begin
            Result.s1 := 'offen';
            Result.s2 := '';
        end
        else
        begin
            Result.s1 := 'zu';
            Result.s2 := '';
        end;

    finally
    RegCloseKey(key_hk);
    end;
end;
er zeigt mir von 65 Werten 6 nur 'offen' an obwohl die Key vorhanden sind
ich lese nochnicht mal werte
oder hab ich hier was vergessen ?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 10. Jun 2003, 01:19
Moin HomerGER,

speicher Dir mal den Rückgabewert von RegOpenKeyEx und lass' ihn Dir den Fehlercode mal mit

ShowMessage(SysErrorMessage(<Worin der Rückgabewert gespeichert wurde>)); anzeigen.
Vielleicht lässt das die Ursache eingrenzen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 9. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#9
  Alt 10. Jun 2003, 16:13
hatte ich schon schon - fehler code 161
hatte ich vergessen hier zu sagen - sorry asche auf ein haupt
wie gesagt mit den Tregistry geht es, aber nicht mit den api hmmmmm
bei MS bin ich nicht ganz sicher ob ich da richtig gesucht habe

ERROR_BAD_PATHNAME The specified path is invalid. 161

der path ist falsch ??!!!
Mulder hilf ???
ich lese in allen HKEY's
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 10. Jun 2003, 17:00
Moin HomerGER,

da TRegistry intern natürlich auch mit den API Funktionen arbeitet, frage ich mich, was eigentlich input_r.s1 enthält?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 19:55 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