| 
| Autor | Beitrag |  
| CrazyLuke 
          Beiträge: 247
 
 Windows XP Pro
 Turbo Delphi Explorer, D2005 PE
 
 | 
Verfasst: Sa 30.04.05 15: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 07:52 
 
Anhand deines Codes würde mal sagen, da fehlen ein paar end s. Oder welche Bedeutung haben die zwei begin s 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') thenRegKey := 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 09: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 10: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:
 
 | usesRegistry;
 
 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 10: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 10: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 11: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)
 |  |  |  |