Entwickler-Ecke

Dateizugriff - Probleme mit Ändern von REG-Files


Force - Do 22.03.07 18:28
Titel: Probleme mit Ändern von REG-Files
Hi,

ich hab eine Procedure geschrieben, die REG-Dateien ausliest und eigentlich auch bestimmt Pfade ersetzen soll - allerdings will der einfach nichts ersetzten ^^

Ich hab mir darauf mal die REG-Datei mit einem Hexeditor angeschaut und mir ist aufgefallen, dass nach jedem Zeichen das "Zeichen" #00 kommt.

Darauf hin hab ich natürlich versucht, den String auch so zu formatieren, dass auch hier nach jedem Zeichen #00 kommt, allerdings ohne Erfolg...


Wisst ihr, wo das Problem ist?


/edit: Ich hab mal ne REG-File angehangen, damit ihr nicht extra eine neue erstellen müsst :)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function NeueNull(s:string):string;
var i:integer;
begin
  result:='';
  for I := 1 to length(s) do
    result:=result+s[i]+#00;
end;




Delphi-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:
30:
function FileToString(const FileName: string): AnsiString;
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
  finally
    fs.Free;
  end;
end;

procedure StringToFile(const FileName: stringconst Contents: AnsiString);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Contents);
    if Len > 0 then
      fs.WriteBuffer(Contents[1], Len);
  finally
    fs.Free;
  end;
end;




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var regname,rootdir,bufferrootdir,buffernewroot:string;
...
      bufferrootdir:=stringreplace(rootdir,'\','\\',[rfReplaceAll]);
      bufferrootdir:=neuenull(bufferrootdir);
      buffernewroot:=stringreplace(sysutils.GetCurrentDir+'\Portable Delphi\Files\Delphi7','\','\\',[rfReplaceAll, rfIgnoreCase]);
      buffernewroot:=neuenull(buffernewroot);
      StringtoFile(sysutils.GetCurrentDir+'\Portable Delphi\registry.REG',stringreplace(Filetostring(sysutils.GetCurrentDir+'\Portable Delphi\registry.REG'),bufferrootdir,buffernewroot,[rfReplaceAll,rfIgnoreCase]));
...


Narses - Do 22.03.07 18:57

Moin!

Filter die #0-Zeichen beim Lesen einfach raus, die sind unnötig (vermute einen Bug beim Export im Regedit... :?), beim Schreiben der REG-Files einfach normalen Text nehmen, das "frisst" der Registrierungseditor. ;)

cu
Narses


Force - Do 22.03.07 19:00

user profile iconNarses hat folgendes geschrieben:
Moin!

Filter die #0-Zeichen beim Lesen einfach raus, die sind unnötig (vermute einen Bug beim Export im Regedit... :?), beim Schreiben der REG-Files einfach normalen Text nehmen, das "frisst" der Registrierungseditor. ;)

cu
Narses



Öhm, ich arbeite nicht wirklich oft mit Dateien (die Proceduren file2string sind auch nur geklaut ^^), deshalb hab ich in diesem BEreich eigentlich so gut wie keine Erfahrung xD

Wie kann man denn die überflüssigen Zeichen rausfiltern?


Narses - Do 22.03.07 19:11

Moin!

Probier das mal so: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function FilterNull(const S: String): String;
  var
    i,j: Integer;
begin
  Result := S;
  j := 0;
  for i := 1 to Length(S) do
    if (Result[i] <> #0then begin
      Inc(j);
      Result[j] := Result[i];
    end;
  SetLength(Result,j);
end;

Ungetestet, aber gute Chancen... ;)

Ach ja, Vorsicht Falle! StringReplace() geht nicht, weil die auf #0-terminierten Strings aufsetzt! :mahn: ;)

cu
Narses


Force - Do 22.03.07 19:18

user profile iconNarses hat folgendes geschrieben:
die sind unnötig (vermute einen Bug beim Export im Regedit... :?), beim Schreiben der REG-Files einfach normalen Text nehmen, das "frisst" der Registrierungseditor.



Hat er leider nicht gefressen, er zeigt dann irgendwelche chinesischen ZEichen an lol

Habs dann auch noch mal mit der NeueNull-Funktion probiert, allerdings war dann auf einmal die Datei doppelt so groß und regedit wollte die Datei nicht mehr annehmen...


Narses - Do 22.03.07 19:31

Moin!

user profile iconForce hat folgendes geschrieben:
Hat er leider nicht gefressen, er zeigt dann irgendwelche chinesischen ZEichen an lol

Wenn ich einen Editor nehme und die Importdaten eintippe, dann "frisst" mein Regedit das. ;) Was machst du?

user profile iconForce hat folgendes geschrieben:
Habs dann auch noch mal mit der NeueNull-Funktion probiert, allerdings war dann auf einmal die Datei doppelt so groß und regedit wollte die Datei nicht mehr annehmen...

Hä? Was tust du da nur... :?!?:

cu
Narses


Force - Do 22.03.07 19:36

user profile iconNarses hat folgendes geschrieben:
Wenn ich einen Editor nehme und die Importdaten eintippe, dann "frisst" mein Regedit das. ;) Was machst du?


Wie gesagt, ich änder die Datei per Delphi (*Welch Überraschung*), und wenn man die Datei per Notepad ändert zeigt der was anderes an. Kannst du ja mal selber versuchen: Füge mit einem Hexeditor oder anderem Programm eine "1" am Anfang der Datei an - und schon zeigt der Texteditor was ganz anderes an ;)

user profile iconNarses hat folgendes geschrieben:
Hä? Was tust du da nur... :?!?:



Na ja, ich hab ja mit deiner Funktion alle "überflüssigen" Steuerzeichen entfernt und dachte wenn ich sie nun wieder anfüge könnte es funktionieren ^^


Narses - Do 22.03.07 19:48

Moin!

Oh, ich sehe grad, Regedit schreibt ja UTF-16... :? Deshalb. Fazit: da mußte mit Multibyte-Funktionen dran. :idea:

cu
Narses


Force - Do 22.03.07 19:50

user profile iconNarses hat folgendes geschrieben:
Moin!

Oh, ich sehe grad, Regedit schreibt ja UTF-16... :? Deshalb. Fazit: da mußte mit Multibyte-Funktionen dran. :idea:

cu
Narses



Öhhm...heißt was? ^^ Wie gesagt, mit sowas hab ich mich noch nie wirklich beschäftigt ^^


Kann man das irgendwie konvertieren?


Lannes - Do 22.03.07 20:12

Hallo,

wenn in den Exportierten Dateien #00 enthalten sind, dann handelt es sich um die Unicode Version, die imho mit Windows2000 eingeführt wurde. Dieses Format wird erzeugt wenn in der Combobox im Dateidialog "Registrierungsdateien (*.reg)" ausgewählt wird.


Quelltext
1:
2:
3:
4:
5:
6:
7:
00000000  FF FE 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00  ÿþW·i·n·d·o·w·s·
00000010  20 00 52 00 65 00 67 00 69 00 73 00 74 00 72 00   ·R·e·g·i·s·t·r·
00000020  79 00 20 00 45 00 64 00 69 00 74 00 6F 00 72 00  y· ·E·d·i·t·o·r·
00000030  20 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00   ·V·e·r·s·i·o·n·
00000040  20 00 35 00 2E 00 30 00 30 00 0D 00 0A 00 0D 00   ·5·.·0·0·······
00000050  0A 00 5B 00 48 00 4B 00 45 00 59 00 5F 00 43 00  ··[·H·K·E·Y·_·C·
00000060  4C 00 41 00 53 00 53 00 45 00 53 00 5F 00 52 00  L·A·S·S·E·S·_·R·


Kannst Du die reg-dateien nicht im alten Format exportieren und bearbeiten, auswählen dann "Win9x-/NT4-Registrierungsdateien (*.reg)". das erzeugt folgende Datei:


Quelltext
1:
2:
00000000  52 45 47 45 44 49 54 34 0D 0A 0D 0A 5B 48 4B 45  REGEDIT4····[HKE
00000010  59 5F 43 4C 41 53 53 45 53 5F 52 4F 4F 54 5C 2E  Y_CLASSES_R


Importieren kann man beide Formate wieder.


Force - Do 22.03.07 20:26

ja, das habe ich auch gesehen, allerdings ist das Problem bei mir, dass ich per Kommando-Zeile exportiere, das heißt ich kann das Format nicht auswählen (sonst hätte ich ja auch TXT genommen ;) )


Trtozdem vielen Dank für die Antwort :)


Lannes - Do 22.03.07 20:52

Hallo,

damit wird eine alte Version erzeugt:

regedit /a C:\temp\Text.reg HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run


Force - Do 22.03.07 20:57

oh man...das ich da nicht selber drauf gekommen bin -. dachte, das würde nur für Win9x gelten...

Tausend Dank für die Antwort, du hast mir ne Menge Arbeit erspart ^^