注册表中多字符串值的读与写的问题 ( 积分: 50 )

  • 主题发起人 binhaiying
  • 开始时间
B

binhaiying

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在程序中读取电脑本地连接的网络配置,但是操作注册表时,发现int和str两种可以操作,但是多字符串值 (REG_MULTI_SZ)这种类型就不知道怎么做了,用下面的代码运行出错,郁闷中!(在//后面的代码是不是有问题,正确的要如何写呢)
procedure TMainFrm.Button1Click(Sender: TObject);
var
reg:TRegistry;
begin
reg:=TRegistry.Create
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('SYSTEM/ControlSet001/Services/Tcpip/Parameters/Interfaces/{FB7FDBD8-53B4-4467-9BE5-DCA68740C467}',true) then
edit1.Text:=inttostr(reg.ReadInteger('AddressType'));
//edit2.Text:=reg.ReadString('IPAddress');
//edit3.Text:=reg.ReadString('SubnetMask');
//edit4.Text:=reg.ReadString('DefaultGateway');
edit5.Text:=reg.ReadString('NameServer');
reg.CloseKey;
finally
reg.Free;
end;
end;
 
我想在程序中读取电脑本地连接的网络配置,但是操作注册表时,发现int和str两种可以操作,但是多字符串值 (REG_MULTI_SZ)这种类型就不知道怎么做了,用下面的代码运行出错,郁闷中!(在//后面的代码是不是有问题,正确的要如何写呢)
procedure TMainFrm.Button1Click(Sender: TObject);
var
reg:TRegistry;
begin
reg:=TRegistry.Create
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('SYSTEM/ControlSet001/Services/Tcpip/Parameters/Interfaces/{FB7FDBD8-53B4-4467-9BE5-DCA68740C467}',true) then
edit1.Text:=inttostr(reg.ReadInteger('AddressType'));
//edit2.Text:=reg.ReadString('IPAddress');
//edit3.Text:=reg.ReadString('SubnetMask');
//edit4.Text:=reg.ReadString('DefaultGateway');
edit5.Text:=reg.ReadString('NameServer');
reg.CloseKey;
finally
reg.Free;
end;
end;
 
我写的一个类:
TRegistryEx = class(TRegistry)
public
procedure ReadREG_MULTI_SZ(Name:string;Strings:TStrings);
procedure WriteREG_MULTI_SZ(Name:string;Strings:TStrings);
end;
实现:
procedure TRegistryEx.ReadREG_MULTI_SZ(Name: string; Strings: TStrings);
var
valueType: DWORD;
valueLen: DWORD;
p, buffer: PChar;
begin
Strings.Clear;
SetLastError(RegQueryValueEx(Self.CurrentKey,
PChar(Name),
nil,
@valueType,
nil,
@valueLen));
if GetLastError = ERROR_SUCCESS then
if valueType = REG_MULTI_SZ then
begin
GetMem(buffer, valueLen);
try

RegQueryValueEx(Self.CurrentKey,
PChar(Name),
nil,
nil,
PBYTE(buffer),
@valueLen);

p := buffer;
while p^ <> #0 do
begin
Strings.Add(p);
Inc(p, lstrlen(p) + 1)
end
finally
FreeMem(buffer)
end
end
else
raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')
else
raise ERegistryException.Create('读取注册表错误!');
end;

procedure TRegistryEx.WriteREG_MULTI_SZ(Name: string; Strings: TStrings);
var
buffer: PArray;
i, size: integer;
Key: HKEY;
begin
size := 0;
for i := 0 to strings.count - 1 do
size := size + Length(strings) + 1;
inc(size);
GetMem (buffer, size);
// fillchar(buffer,0,size);
ZeroMemory(Pointer(buffer), size);
try
size := 0;

for i := 0 to strings.count - 1 do
begin
move(strings[1],buffer^[size],length(strings));
inc(size, length(strings)+1);
end;
inc(size);

try
if RegSetValueEx(Self.CurrentKey, PChar(Name),
0, REG_MULTI_SZ, buffer, size) <> ERROR_SUCCESS then
raise Exception.Create(
'写入注册表错误!');
finally
// RegCloseKey(Key);
end;
finally
FreeMem (buffer)
end
end;
 
为什么要这么复杂呢,有没有更简单一点的方法呢?
或者 xeen 你能不能传个例子给我啊,谢谢!!
 
顶部