Autor Beitrag
JayK
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1013



BeitragVerfasst: Mi 03.08.05 13:33 
Hallo,

wie kann ich einen Schlüssel aus der Registry exportieren? Wenn's geht im textformat als *.reg-Datei.
Ich bin schon bei RegSaveKey vorbeigekommen, aber die Delphi-OH will mir dazu nix sagen (Thema nicht vorhanden) :x
(* Edit: Aber zu tRegistry.Savekey gibts was :roll:, aber wenn ich damit einen Schlüssel exportiere kommt eine leere (0 Byte große) Datei bei raus :-( *)

Schonmal Danke im vorraus,
JayK
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Mi 03.08.05 13:54 
Schau doch mal, ob du im Bereich TRegIniFile / TRegistryIniFile weiterkommst. Da müssten Registry-Pfade als "Section" verwaltet werden.
da_cara
Hält's aus hier
Beiträge: 12

Win XP SP2
D7 Ent
BeitragVerfasst: Mi 03.08.05 13:58 
Bin mir net sicher ob du das meinst, aber:

SaveKey (Methode von TRegistry)

Die Methode öffnet den angegebenen Schlüssel in der Zugriffsebene KEY_ALL_ACCESS und speichert den angegebenen Schlüssel zusammen mit allen Unterschlüsseln und Datenwerten in einer Hive-Datei.

Delphi-Syntax:

function SaveKey(const Key, FileName: String): Boolean;

C++ Syntax:

bool __fastcall SaveKey(const AnsiString Key, const AnsiString FileName);

Beschreibung

Mit SaveKey wird ein Schlüssel in der Zugriffsebene KEY_ALL_ACCESS geöffnet. Er gelangt dann mit allen Unterschlüsseln und Datenwerten in eine Hive-Datei. Der Begriff Hive bezeichnet eine aus einzelnen Teilen bestehende Menge von Schlüsseln, Unterschlüsseln und Datenwerten, deren Verzweigung von der obersten Ebene der Registrierungshierarchie ausgeht.

Der String Key enthält den Schlüssel, der gespeichert werden soll. Der Parameter FileName gibt die Datei an, in der die Informationen gespeichert werden sollen. Es muss sich um den Namen einer neuen, noch nicht vorhandenen Datei handeln. Bei Dateisystemen, denen eine Dateizuordnungstabelle (FAT) zugrunde liegt, darf FileName keine Namenserweiterung enthalten.

Von SaveKey erzeugte Dateien werden als Parameter an die Funktionen RestoreKey, ReplaceKey und LoadKey übergeben.

Bei erfolgreicher Ausführung gibt SaveKey den Wert true zurück und schließt den Schlüssel.

.. dein Edit zu spät gelesen :) dann kann ich dir net helfen sry

mfg cara
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 03.08.05 14:23 
Ich habe es mir für ein Batch mal für "normale" Werte gemacht. Theoretisch sollte es mit allem funktionieren, aber naja:

ausblenden volle Höhe 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:
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:
program Snapshot;

uses
  SysUtils,
  Windows,
  Classes,
  Registry;

function RegistrySnapshot(const Root: HKEY; const Key:string; Strs:TStrings;
 const Append:boolean): boolean;
var Registry:TRegistry;
    RootKeyName:string;

 function GetValue(const Name:string=''):string;

  function EscapeStr(const Str:string):string;
  begin
   Result:=StringReplace(Str,'"','\"',[rfReplaceAll]);
  end;

 var DataType: TRegDataType;
     Buf: array of Char;
     i: integer;
 begin
  if length(Name)>0 then DataType:=Registry.GetDataType(Name)
   else DataType:=rdString;

  case DataType of
   rdExpandString,
   rdString: Result:='"'+EscapeStr(Registry.ReadString(Name))+'"';
   rdInteger:Result:='dword:'+LowerCase(IntToHex(Registry.ReadInteger(Name),8));
   {rdUnknown,
   rdBinary,}

   else begin
    SetLength(Buf,Registry.GetDataSize(Name));
    Registry.ReadBinaryData(Name,Buf[0],Registry.GetDataSize(Name));
    Result:='';
    for i:=0 to Length(Buf)-1 do Result:=Result+','+IntToHex(Ord(Buf[i]),2);
    Result:='hex:'+LowerCase(copy(Result,2,length(Result)));
   end;
  end;
 end;

 procedure SnapKey(const KeyName:string);
 var Objects:TStrings;
     i:integer;
 begin
  Objects:=TStringList.Create;
  with Registry do try
   if OpenKeyReadOnly(KeyName) then begin
    Strs.Add('');
    Strs.Add('['+RootKeyName+KeyName+']');
    // First the standard value (if any)
    if ValueExists('') then Strs.Add('@='+GetValue);
    // Then get all values
    GetValueNames(Objects);
    for i:=0 to Objects.Count-1 do begin
     Strs.Add('"'+Objects[i]+'"='+GetValue(Objects[i]));
    end;
    // The same procedure for all subkeys
    GetKeyNames(Objects);
    for i:=0 to Objects.Count-1 do SnapKey(KeyName+'\'+Objects[i]);
   end;
  finally
   Objects.Free;
  end;
 end;

begin
 Result:=False;
 case Root of
  HKEY_CLASSES_ROOT:    RootKeyName:='HKEY_CLASSES_ROOT';
  HKEY_CURRENT_USER:    RootKeyName:='HKEY_CURRENT_USER';
  HKEY_LOCAL_MACHINE:   RootKeyName:='HKEY_LOCAL_MACHINE';
  HKEY_USERS:           RootKeyName:='HKEY_USERS';
  HKEY_PERFORMANCE_DATA:RootKeyName:='HKEY_PERFORMANCE_DATA';
  HKEY_CURRENT_CONFIG:  RootKeyName:='HKEY_CURRENT_CONFIG';
  HKEY_DYN_DATA:        RootKeyName:='HKEY_DYN_DATA';
  else RootKeyName:='Unknown';
 end;
 if not Append then begin
  Strs.Clear;
  Strs.Add('REGEDIT4');
 end;
 Registry:=TRegistry.Create;
 with Registry do try
  RootKey:=Root;
  if not KeyExists(Key) then Exit;
  SnapKey(Key);
 finally
  CloseKey;
  Free;
 end;
end;

var i:integer;
    Root,Key:string;
    HRoot: HKEY;
    Output: TStrings;
begin
 HRoot:=0;
 Output:=TStringList.Create;
 try
  for i:=1 to ParamCount do begin
   Root:=UpperCase(copy(ParamStr(i),1,pos('\',ParamStr(i))-1));
   Key:=copy(ParamStr(i),pos('\',ParamStr(i))+1,length(ParamStr(i)));
   if Root='HKEY_CLASSES_ROOT' then HRoot:=HKEY_CLASSES_ROOT
   else if Root='HKEY_CURRENT_USER' then HRoot:=HKEY_CURRENT_USER
   else if Root='HKEY_LOCAL_MACHINE' then HRoot:=HKEY_LOCAL_MACHINE
   else if Root='HKEY_USERS' then HRoot:=HKEY_USERS
   else if Root='HKEY_PERFORMANCE_DATA' then HRoot:=HKEY_PERFORMANCE_DATA
   else if Root='HKEY_CURRENT_CONFIG' then HRoot:=HKEY_CURRENT_CONFIG
   else if Root='HKEY_DYN_DATA' then HRoot:=HKEY_DYN_DATA
   else begin
    MessageBox(0,PChar('Unknown root key. Ignoring'+#13+Root),'Error',
     MB_ICONERROR);
    Continue;
   end;

   if length(Key)>0 then Key:='\'+Key;
   RegistrySnapshot(HRoot,Key,Output,i>1);
  end;

  {$APPTYPE CONSOLE}
  Writeln(Output.Text);
 finally
  Output.Free;
 end;
end.

Ist nicht wirklich sauber gemacht, aber es musste halt schnell gehen ;)

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
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: Mi 03.08.05 14:46 
Hallo,

und wie wäre es damit?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ShellExecute(Form1.Handle
             ,'open'
             ,'regedit.exe'
             ,Pchar('/e C:\@Archiv\bmp.REG "HKEY_CLASSES_ROOT\.bmp"')
             ,''
             ,SW_SHOWNORMAL);


Getestet und genutzt unter NT 4.0

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



BeitragVerfasst: Mi 03.08.05 15:18 
user profile iconLannes hat folgendes geschrieben:
und wie wäre es damit?

Das klappt. Danke :-D
:autsch: so einfach gehts, hätte man auch selbst drauf kommen können...