如何用API来操作注册表的导入,导出。

rippler 2006-01-09 07:29:35
由于操作系统的不同注册表的操作会有不同,在XP上如何利用Registry来完成部分信息的导出,导入。或者用API来实现。对于导出格式的控制。如.reg,.txt等。
望各位大虾出手相助。
...全文
198 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rippler 2006-01-10
  • 打赏
  • 举报
回复
这位大虾真是出手不凡,但我希望能给出用程序实现写入的方法。谢谢。
aiirii 2006-01-09
  • 打赏
  • 举报
回复
backup a branch of the registry?

unit RegExpo;

interface

uses
Windows, rRegistry, Classes, SysUtils;

{$I-}
{$LONGSTRINGS ON}

{
Regexpo

Author : Arthur Hoornweg (arthur.hoornweg@email.de)
Version : 1.00, May 1998
O/S : Windows 95, 98, ME, NT, 2000, XP
Delphi 2+
Function :
This unit allows you to backup a branch of the registry into a *.REG file,
that is compatible with "regedit".
Double-clicking such a file in the explorer will import it.


Example:
ExportRegistryBranch(HKEY_LOCAL_MACHINE,'SOFTWARE\Borland\Delphi','A:\DELPHI.REG')

(c) 1998 A.M. Hoornweg. All rights reserved.

You may use this software for all purposes, both commercial and
noncommercial, as long as proper credit is given. The sourcecode may be distributed
freely, as long as this copyright is included and no more than a marginal fee is
asked.


Disclaimer:

I accept no responsibility whatsoever for any damages caused by these
routines. Use them at your own risk. If you find any bugs, please let me know.
}


procedure ExportRegistryBranch(Rootsection: Integer; regroot: string;
FileName: string);

implementation

function dblBackSlash(t: string): string;
var
k: longint;
begin
Result := t; {Strings are not allowed to have}
for k := Length(t) downto 1 do {single backslashes}
if Result[k] = '\' then Insert('\', Result, k);
end;


procedure ExportRegistryBranch(rootsection: Integer; Regroot: string;
FileName: string);
var
reg: TRegistry;
f: Textfile;
p: PChar;

procedure ProcessBranch(root: string); {recursive sub-procedure}
var
values, keys: TStringList;
i, j, k: longint;
s, t: string; {longstrings are on the heap, not on the stack!}
begin
Writeln(f); {write blank line}
case rootsection of
HKEY_CLASSES_ROOT: s := 'HKEY_CLASSES_ROOT';
HKEY_CURRENT_USER: s := 'HKEY_CURRENT_USER';
HKEY_LOCAL_MACHINE: s := 'HKEY_LOCAL_MACHINE';
HKEY_USERS: s := 'HKEY_USERS';
HKEY_PERFORMANCE_DATA: s := 'HKEY_PERFORMANCE_DATA';
HKEY_CURRENT_CONFIG: s := 'HKEY_CURRENT_CONFIG';
HKEY_DYN_DATA: s := 'HKEY_DYN_DATA';
end;
Writeln(f, '[' + s + '\' + root + ']'); {write section name in brackets}

reg.OpenKey(root, False);
try
values := TStringList.Create;
try
keys := TStringList.Create;
try
reg.GetValuenames(values); {get all value names}
reg.GetKeynames(keys); {get all sub-branches}

for i := 0 to values.Count - 1 do {write all the values first}
begin
s := values[i];
t := s; {s=value name}
if s = '' then s := '@' {empty means "default value", write as @}
else
s := '"' + s + '"'; {else put in quotes}
Write(f, dblbackslash(s) + '='); {write the name of the key to the file}

case reg.Getdatatype(t) of {What type of data is it?}

rdString, rdExpandString: {String-type}
Writeln(f, '"' + dblbackslash(reg.ReadString(t) + '"'));

rdInteger: {32-bit unsigned long integer}
Writeln(f, 'dword:' + IntToHex(reg.readinteger(t), 8));

{write an array of hex bytes if data is "binary." Perform a line feed
after approx. 25 numbers so the line length stays within limits}

rdBinary:
begin
Write(f, 'hex:');
j := reg.GetDataSize(t); {determine size}
GetMem(p, j); {Allocate memory}
reg.ReadBinaryData(t, p^, J); {read in the data, treat as pchar}
for k := 0 to j - 1 do
begin
Write(f, IntToHex(Byte(p[k]), 2)); {Write byte as hex}
if k <> j - 1 then {not yet last byte?}
begin
Write(f, ','); {then write Comma}
if (k > 0) and ((k mod 25) = 0) {line too long?} then
Writeln(f, '\'); {then write Backslash +lf}
end; {if}
end; {for}
FreeMem(p, j); {free the memory}
Writeln(f); {Linefeed}
end;
else
Writeln(f, '""'); {write an empty string if datatype illegal/unknown}
end;{case}
end; {for}
finally
reg.CloseKey;
end;

finally
{value names all done, no longer needed}
values.Free;
end;

{Now al values are written, we process all subkeys}
{Perform this process RECURSIVELY...}
for i := 0 to keys.Count - 1 do
ProcessBranch(root + '\' + keys[i]);
finally
keys.Free; {this branch is ready}
end;
end; { ProcessBranch}


begin
if RegRoot[Length(Regroot)] = '\' then {No trailing backslash}
SetLength(regroot, Length(Regroot) - 1);
Assignfile(f, FileName); {create a text file}
Rewrite(f);
if ioResult <> 0 then Exit;
Writeln(f, 'REGEDIT4'); {"magic key" for regedit}

reg := TRegistry.Create;
try
reg.Rootkey := Rootsection;
{Call the function that writes the branch and all subbranches}
ProcessBranch(Regroot);
finally
reg.Free; {ready}
Close(f);
end;
end;

end.
老之 2006-01-09
  • 打赏
  • 举报
回复
用TRegistry对象的LoadKey和SaveKey可以实现导入导出。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧