Autor Beitrag
Force
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: Do 22.03.07 18:28 
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 :)


ausblenden 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;



ausblenden 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;



ausblenden 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]));
...
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 22.03.07 19:11 
Moin!

Probier das mal so: ;)
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.

ausblenden 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:

ausblenden 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.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Force Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 143

Ubuntu Jaunty
FreePascal
BeitragVerfasst: 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 ^^