用API操作注册表?
不用TRegistry,如何用API枚举某键下面的subkey 和value?
谁有没有用API操作注册表的完整的API例子(包括枚举,读取各种类型的值)?
找了很久,没找到,哪们知道,指教一下,谢!
问题点数:20、回复次数:6Top
1 楼phoex(后羿)回复于 2005-12-21 23:33:58 得分 0
你可以去看一下TRegistry的实现呀!Top
2 楼TurtleRock(wu)回复于 2005-12-22 00:00:25 得分 0
多谢 phoex(后羿)兄指教。
我看过TRegistry,但是它太对象化了,每个东西都对象化,因此显得有点过于繁杂
自己一个一个去找,再写,有点麻烦。
想直接找个大家写好了来用用。Top
3 楼liangqingzhi(老之)回复于 2005-12-22 02:57:47 得分 10
function RegEnum(RootKey:HKEY;Name:String;var ResultList:String;const DoKeys:Boolean):boolean;
var //枚举
i:integer;
iRes:integer;
s:String;
hTemp:HKEY;
Buf:Pointer;
BufSize:Cardinal;
begin
Result:=False;
ResultList:='';
if RegOpenKeyEx(RootKey,PChar(Name),0,KEY_READ,hTemp)=ERROR_SUCCESS then
begin
Result:=True;
BufSize:=1024;
GetMem(buf, BufSize);
i:=0;
iRes := ERROR_SUCCESS;
while iRes=ERROR_SUCCESS do
begin
BufSize:=1024;
if DoKeys then
iRes:=RegEnumKeyEx(hTemp,i,buf,BufSize,nil,nil,nil,nil)
else
iRes:=RegEnumValue(hTemp,i,buf,BufSize,nil,nil,nil,nil);
if iRes=ERROR_SUCCESS then
begin
SetLength(s,BufSize);
Move(buf^,s[1],BufSize);
if ResultList='' then
ResultList:=s
else
ResultList:=Concat(ResultList,#13#10,s);
inc(i);
end;
end;
FreeMem(buf);
RegCloseKey(hTemp);
end;
end;
procedure TForm1.Button1Click(Sender: TObject); //读取键值
var hKey1:HKEY;
size:Cardinal;
value:array[0..255]of char;
begin
RegOpenKeyEx(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',0,KEY_READ,hKey1);
RegQueryValueEx(hKey1,'CommonFilesDir',nil,nil,@value,@size);
ShowMessage(value);
RegCloseKey(hKey1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var s:string;
begin
RegEnum(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',s,False);
ShowMessage(s);
end;Top
4 楼nmgyjw(袁继武)回复于 2005-12-22 08:29:46 得分 0
可以查一下具体的帮助文件呀!Top
5 楼Kingron(单身走我路……)回复于 2005-12-22 09:27:40 得分 10
function RegGetValueNames(const RootKey: HKEY; const SubKey: string; Names: TStrings): Boolean;
{
返回注册表中指定主键下的所有的键名列表
}
var
RegKey: HKEY;
I: DWORD;
Size: DWORD;
NumSubKeys: DWORD;
NumSubValues: DWORD;
MaxSubValueLen: DWORD;
ValueName: string;
begin
Result := False;
if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, RegKey) = ERROR_SUCCESS then
begin
if RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, nil, nil, @NumSubValues, @MaxSubValueLen, nil, nil, nil) = ERROR_SUCCESS then
begin
SetLength(ValueName, MaxSubValueLen + 1);
if NumSubValues <> 0 then
for I := 0 to NumSubValues - 1 do
begin
Size := MaxSubValueLen + 1;
RegEnumValue(RegKey, I, PChar(ValueName), Size, nil, nil, nil, nil);
Names.Add(PChar(ValueName));
end;
Result := True;
end;
RegCloseKey(RegKey);
end;
end;
function RegGetKeyNames(const RootKey: HKEY; const SubKey: string; Names: TStrings): Boolean;
{
返回注册表中指定主键下的所有子键的名称列表
}
var
RegKey: HKEY;
I: DWORD;
Size: DWORD;
NumSubKeys: DWORD;
MaxSubKeyLen: DWORD;
KeyName: string;
begin
Result := False;
if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, RegKey) = ERROR_SUCCESS then
begin
if RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil) = ERROR_SUCCESS then
begin
SetLength(KeyName, MaxSubKeyLen + 1);
if NumSubKeys <> 0 then
for I := 0 to NumSubKeys - 1 do
begin
Size := MaxSubKeyLen + 1;
RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil);
Names.Add(PChar(KeyName));
end;
Result := True;
end;
RegCloseKey(RegKey);
end
end;Top
6 楼TurtleRock(wu)回复于 2005-12-22 13:11:22 得分 0
谢谢各位,结贴Top




