Autor |
Beitrag |
Force
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: 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
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: string; const 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])); ... |
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Do 22.03.07 19:00
Narses 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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] <> #0) then 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!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Force 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Do 22.03.07 19:18
Narses 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 22.03.07 19:31
Moin!
Force 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?
Force 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 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Do 22.03.07 19:36
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Force 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Do 22.03.07 19:50
Narses hat folgendes geschrieben: | Moin!
Oh, ich sehe grad, Regedit schreibt ja UTF-16... Deshalb. Fazit: da mußte mit Multibyte-Funktionen dran.
cu
Narses |
Öhhm...heißt was? ^^ Wie gesagt, mit sowas hab ich mich noch nie wirklich beschäftigt ^^
Kann man das irgendwie konvertieren?
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Force 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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 
      
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: 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 ^^
|
|