Autor |
Beitrag |
CrazyLuke
      
Beiträge: 247
Windows XP Pro
Turbo Delphi Explorer, D2005 PE
|
Verfasst: Sa 30.04.05 16:21
Hi!
Ich hab folgende Funktion, wenn ich dort RegKey auf "REG_SZ" stelle, erscheint die Fehlermeldung "[Fehler] Unit1.pas(71): E2029 '..' erwartet, aber ';' gefunden"
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.BitBtn1Click(Sender: TObject); var Reg: TRegistry; RegKey: DWORD; Key: string; begin begin begin reg := TRegistry.Create(KEY_READ); try Reg.RootKey := HKEY_CURRENT_USER; Key := 'Software\ahead\Nero - Burning Rom\General'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('Disable-ResetWhenDowngrading') then RegKey := Reg.ReadInteger('Disable-ResetWhenDowngrading'); Reg.CloseKey; if (RegKey=1) then CheckBox3.Checked := true; end; |
MfG
CrazyLuke
_________________ "Was kommt vor 'Schmetterlinge im Bauch'? Raupen im A*sch!" (Bastian Pastewka, "Pastewka", Sat1)
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 01.05.05 08:52
Anhand deines Codes würde mal sagen, da fehlen ein paar ends. Oder welche Bedeutung haben die zwei begins am Anfang?  Vllt. bin ich noch nicht richtig wach, aber ich verstehe dein Problem leider nicht. Mal abgesehen von der genannten Sache (die ich aber nicht beurteilen kann, weil du nur Bruchstücke des Codes zeigst), ist dein Code ein bisschen unlogisch, aber an sich nicht falsch.
Unlogisch, weil:
Delphi-Quelltext 1: 2:
| if Reg.KeyExists('Disable-ResetWhenDowngrading') then RegKey := Reg.ReadInteger('Disable-ResetWhenDowngrading'); |
du die Existenz eines Schlüssels prüfst, aber einen Wert ausliest. Ich schätze, du suchst "ValueExists".
|
|
CrazyLuke 
      
Beiträge: 247
Windows XP Pro
Turbo Delphi Explorer, D2005 PE
|
Verfasst: So 01.05.05 10:52
Sorry, da sind wohl zwei ends abhanden gekommen.
Ich hab gedacht, ich könnte folgenden Code einfach umbauen:
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| procedure TForm3.BitBtn1Click(Sender: TObject); var Reg: TRegistry; RegKey: DWORD; Key: string; begin begin begin reg := TRegistry.Create(KEY_READ); try Key := 'SYSTEM\CurrentControlSet\Services'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('cdrmkaun') then CheckBox1.Checked := true; end; Key := 'SYSTEM\CurrentControlSet\Enum\Root'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('LEGACY_CDRMKAUN') then CheckBox2.Checked := true; end; Key := 'SYSTEM\CurrentControlSet1\Services'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('cdrmkaun') then CheckBox3.Checked := true; end; Key := 'SYSTEM\CurrentControlSet1\Enum\Root'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('LEGACY_CDRMKAUN') then CheckBox4.Checked := true; end; Key := 'SYSTEM\CurrentControlSet2\Services'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('cdrmkaun') then CheckBox5.Checked := true; end; Key := 'SYSTEM\CurrentControlSet2\Enum\Root'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('LEGACY_CDRMKAUN') then CheckBox6.Checked := true; end; finally Reg.Free end; end; begin CheckBox7.Checked := FileExists(TempDir + '\cdrmkaun.sys'); CheckBox8.Checked := FileExists(TempDir + '\CmdLineExt02.dll'); CheckBox9.Checked := FileExists(TempDir + '\SIntf16.dll'); CheckBox10.Checked := FileExists(TempDir + '\SIntf32.dll'); CheckBox11.Checked := FileExists(TempDir + '\SintfIcn.ani'); CheckBox12.Checked := FileExists(TempDir + '\SintFNT.dll'); end; end; ShowMessage('ACHTUNG BETA-VERSION! Vor einer Änderung unbedingt Registry sichern!'); BitBtn2.Enabled:=True; end; |
So sieht der neue Code im neuen Programm komplett aus:
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| procedure TForm1.BitBtn1Click(Sender: TObject); var Reg: TRegistry; RegKey: DWORD; RegKey2: DWORD; Key: string; begin begin begin reg := TRegistry.Create(KEY_READ); try Reg.RootKey := HKEY_CURRENT_USER; Key := 'Software\ahead\Nero - Burning Rom\General'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('Disable-ResetWhenDowngrading') then RegKey2 := Reg.ReadInteger('Disable-ResetWhenDowngrading'); Reg.CloseKey; if (RegKey2=1) then CheckBox3.Checked := true; end; Key := 'Software\Ahead\Nero - Burning Rom\Browser'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('ShowHiddenAndSystemFiles') then RegKey := Reg.ReadInteger('ShowHiddenAndSystemFiles'); Reg.CloseKey; if (RegKey=1) then CheckBox4.Checked := true; end; Key := 'Software\Ahead\Nero - Burning Rom\Recorder'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('UseStaticWriteSpeedTable') then RegKey := Reg.ReadInteger('UseStaticWriteSpeedTable'); Reg.CloseKey; if (RegKey=1) then CheckBox2.Checked := true; end; Key := 'Software\Ahead\Nero - Burning Rom\Recorder'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('ShowSingleRecorderSpeed') then RegKey := Reg.ReadInteger('ShowSingleRecorderSpeed'); Reg.CloseKey; if (RegKey=1) then CheckBox1.Checked := true; end; finally Reg.Free end; end; end; end; |
Ich hab gedacht, es reicht, wenn ich prüfe, ob der Eintrag existiert, denn dann würde es auch einen Wert geben. Ich wusste nicht, dass Windows auch Einträge ohne Wert erlaubt.
MfG
CrazyLuke
_________________ "Was kommt vor 'Schmetterlinge im Bauch'? Raupen im A*sch!" (Bastian Pastewka, "Pastewka", Sat1)
|
|
Harry M.
      
Beiträge: 754
Win 2000, XP
D2005
|
Verfasst: So 01.05.05 11:12
Mit dem Lesen von REG_SZ-Werten hatte ich auch schon meine Probleme. Das hier habe ich dann mal bei den Schweitzern gefunden:
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219:
| uses Registry;
procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string; Strings: TStrings); var valueType: DWORD; valueLen: DWORD; p, buffer: PChar; key: HKEY; begin Strings.Clear; if RegOpenKeyEx(CurrentKey, PChar(Subkey), 0, KEY_READ, key) = ERROR_SUCCESS then begin SetLastError(RegQueryValueEx(key, PChar(ValueName), nil, @valueType, nil, @valueLen)); if GetLastError = ERROR_SUCCESS then if valueType = REG_MULTI_SZ then begin GetMem(buffer, valueLen); try RegQueryValueEx(key, PChar(ValueName), nil, nil, PBYTE(buffer), @valueLen); p := buffer; while p^ <> #0 do begin Strings.Add(p); Inc(p, lstrlen(p) + 1) end finally FreeMem(buffer) end end else raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...') else raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+ 'Kann den MULTI_SZ Wert nicht lesen...'); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\XYZ', 'Test44', Memo1.Lines); end;
procedure TFrmReadBinary.Button1Click(Sender: TObject); const CKeyName: string = 'System\Setup'; CValName: string = 'NetcardDlls'; var keyGood: boolean; p: integer; regKey: TRegistry; tmpStr: string; vSize: integer; begin regKey := TRegistry.Create; try regKey.RootKey := HKEY_LOCAL_MACHINE; keyGood := regKey.OpenKey(CKeyName, False);
if (keyGood) then begin vSize := regKey.GetDataSize(CValName);
if (vSize > 0) then begin SetLength(tmpStr, vSize); regKey.ReadBinaryData(CValName, tmpstr[1], vSize);
repeat p := Pos(#0, tmpStr);
if p <> 0 then begin Delete(tmpStr, p, 1); Insert(#13#10, tmpStr, p); end; until p = 0;
ListBox1.Items.Text := tmpStr; end; end; finally regKey.Free; end; end;
procedure RaiseWin32Error(Code: Cardinal); var Error: EWin32Error; begin Error := EWin32Error.CreateResFmt(@SWin32Error, [Code, SysErrorMessage(Code)]); Error.ErrorCode := Code; raise Error; end;
procedure TForm1.Button1Click(Sender: TObject); const Str = 'multiple'#0'strings'#0'in one'#0'registry'#0'value'#0; var Reg: TRegistry; Res: Integer; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if not Reg.OpenKey('\Software\Test\RegMultiSzTest', true) then raise Exception.Create('Can''t open key'); Res := RegSetValueEx( Reg.CurrentKey, 'TestValue', 0, REG_MULTI_SZ, PChar(Str), Length(Str) + 1); if Res <> ERROR_SUCCESS then RaiseWin32Error(Res); finally Reg.Free; end; end;
procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; DataType: Cardinal; DataSize: Cardinal; Res: Integer; Str: String; i: Integer; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if not Reg.OpenKeyReadOnly('\Software\Test\RegMultiSzTest') then raise Exception.Create('Can''t open key'); DataSize := 0; Res := RegQueryValueEx( Reg.CurrentKey, 'TestValue', nil, @DataType, nil, @DataSize); if Res <> ERROR_SUCCESS then RaiseWin32Error(Res); if DataType <> REG_MULTI_SZ then raise Exception.Create('Wrong data type'); SetLength(Str, DataSize - 1); if DataSize > 1 then begin Res := RegQueryValueEx( Reg.CurrentKey, 'TestValue', nil, @DataType, PByte(Str), @DataSize); if Res <> ERROR_SUCCESS then RaiseWin32Error(Res); end;
for i := Length(Str) downto 1 do if Str[i] = #0 then Str[i] := #13; ShowMessage(Str); finally Reg.Free; end; end; |
_________________ Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
|
|
CrazyLuke 
      
Beiträge: 247
Windows XP Pro
Turbo Delphi Explorer, D2005 PE
|
Verfasst: So 01.05.05 11:17
Puh, das ist ja wieder ganz anders aufgebaut. Mal gucken, ob ich das raff mit so vielen mir noch unbekannten Begriffen. Ich müsste die Werte übrigens später auch noch schreiben. Gibt das auch wieder Probleme?
MfG
CrazyLuke
_________________ "Was kommt vor 'Schmetterlinge im Bauch'? Raupen im A*sch!" (Bastian Pastewka, "Pastewka", Sat1)
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 01.05.05 11:55
CrazyLuke hat folgendes geschrieben: | Ich hab gedacht, ich könnte folgenden Code einfach umbauen: |
Dein Versuch in allen Ehren, aber "einfach umbauen" ist wohl nicht. Ich sage es zum letzten Mal: Du prüfst mit "KeyExists" die Existenz eines Schlüssels. Im von dir gezeigten Beispiel reicht das aus, um die Checkboxen zu setzen. Aber du willst offensichtlich Werte auslesen. Darum musst du "ValueExists" nehmen! Aber das habe ich dir bereits gesagt.
Abgesehen davon müsste derjenige, der dieses Codestück verbrochen hat, auch eins auf die Finger kriegen. Dieser begin/ end-Quatsch ist vollkommen überflüssig. Von der Einrückung, durch die man den Code schwerer lesen kann, will ich gar nicht reden.
Zitat: | Delphi-Quelltext 1: 2: 3: 4: 5:
| Key := 'SYSTEM\CurrentControlSet2\Services'; if Reg.OpenKeyReadOnly(Key) then begin if Reg.KeyExists('cdrmkaun') then CheckBox5.Checked := true; end; | |
Vllt. solltest du so einen Unfug nicht einfach übernehmen.
Zitat: | Ich hab gedacht, es reicht, wenn ich prüfe, ob der Eintrag existiert, denn dann würde es auch einen Wert geben. Ich wusste nicht, dass Windows auch Einträge ohne Wert erlaubt. |
Das verstehe ich jetzt aber wieder nicht. Wovon sprichst du?  Was sind für dich "Einträge ohne Wert"?
Zitat: | Ich müsste die Werte übrigens später auch noch schreiben. Gibt das auch wieder Probleme? |
Eigentlich nur, wenn du absolut keine Ahnung von dem hast, was du tust. Vllt. wär´s besser, du machst dich erst mal grundlegend mit den Registry-Funktionen vertraut? Einfach Code übernehmen und ein bisschen ändern, reicht in dem Fall nicht. Die Gefahr, sich die Registry zu versauen, ist enorm groß. Aber solange das nur auf deinem Rechner passiert und nicht bei den Leuten, die dein Programm testen, ...
btw, die Ausführungen von Harry kannst du getrost ignorieren. Es geht dabei nämlich um REG_MULTI_SZ, quasi in der Registry gespeicherte Stringlisten. Und das brauchst du in deinem Fall nicht, da du offenbar sowieso Integer-Werte ausliest. Vllt. solltest du dir auch erst mal darüber klar werden, worum es dir eigentlich geht. Ansonsten ist nämlich dein Beitragstitel absolut daneben.
@Harry: Ein normaler Link zu den Schweizern hätte doch auch getan.
|
|
CrazyLuke 
      
Beiträge: 247
Windows XP Pro
Turbo Delphi Explorer, D2005 PE
|
Verfasst: So 01.05.05 12:16
MathiasSimmack hat folgendes geschrieben: | Dein Versuch in allen Ehren, aber "einfach umbauen" ist wohl nicht. Ich sage es zum letzten Mal: Du prüfst mit "KeyExists" die Existenz eines Schlüssels. Im von dir gezeigten Beispiel reicht das aus, um die Checkboxen zu setzen. Aber du willst offensichtlich Werte auslesen. Darum musst du "ValueExists" nehmen! Aber das habe ich dir bereits gesagt.
[...]
Das verstehe ich jetzt aber wieder nicht. Wovon sprichst du? Was sind für dich "Einträge ohne Wert"? |
Sorry, ich meinte damit die Schlüssel. Denn normalerweise ist ja jedem Schlüsselk ein Wert zugeordnet. Und ich hab gedacht, wenn es den Schlüssel gibt, gibt es auch einen dazugehörigen Wert, Ich wusste nicht, dass ich in diesem Fall nach dem Wert gucken lassen muss.
Zitat: | Abgesehen davon müsste derjenige, der dieses Codestück verbrochen hat, auch eins auf die Finger kriegen. Dieser begin/end-Quatsch ist vollkommen überflüssig. Von der Einrückung, durch die man den Code schwerer lesen kann, will ich gar nicht reden. |
Oh, so schlimm? Ich werd mal sehen, was sich machen lässt...
Zitat: | Einfach Code übernehmen und ein bisschen ändern, reicht in dem Fall nicht. |
Okay, und wieder was schlauer geworden
MfG
CrazyLuke
_________________ "Was kommt vor 'Schmetterlinge im Bauch'? Raupen im A*sch!" (Bastian Pastewka, "Pastewka", Sat1)
|
|
|