多字符串值 uses registry; ...procedure kg_ReadStrings(const valueName: string; aStrings: TStrings; oReg:TRegistry) ; var valueType : DWORD ; valueLen : DWORD ; p, buffer : PChar ; begin aStrings.Clear ; SetLastError(RegQueryValueEx(oReg.CurrentKey, PChar(valueName),nil, @valueType,nil, @valueLen)) ; if GetLastError = ERROR_SUCCESS then if valueType = REG_MULTI_SZ then begin GetMem(buffer, valueLen) ; try RegQueryValueEx(oReg.CurrentKey, PChar(valueName), nil, nil, PBYTE(buffer), @valueLen) ; p := buffer ; while p^ <> #0 do begin aStrings.Add(p) ; Inc(p, lstrlen(p) + 1) end finally FreeMem(buffer) end end else raise ERegistryException.Create('String list expected') else raise Exception.Create('Unable read MULTI_SZ value') end;procedure kg_WriteStrings(const valueName: string; aStrings: TStrings; oReg:TRegistry) ; var p, buffer : PChar ; i : Integer ; size : DWORD ; begin size := 0 ; for i := 0 to aStrings.Count - 1 do Inc(size, Length(aStrings [i]) + 1) ; Inc (size) ; GetMem(buffer, size) ; try p := buffer ; for i := 0 to aStrings.count - 1 do begin lstrcpy(p, PChar(aStrings [i])) ; Inc(p, lstrlen (p) + 1) end; p^ := #0 ; SetLastError(RegSetValueEx(oReg.CurrentKey, PChar(valueName), 0, REG_MULTI_SZ, buffer, size)) ; if GetLastError <> ERROR_SUCCESS then raise Exception.Create('Unable to write MULTI_SZ value') ; finally FreeMem(buffer) end end;... var Reg : TRegistry ; aStr: TStringList ; begin Reg := TRegistry.Create ; aStr:= TStringList.Create ;try if Reg.OpenKey('kg_ms',True) then begin aStr.Add('This is a test to see how to read and write') ; aStr.Add('MULTI_SZ type to the system registry.') ; aStr.Add('Infomation entered: ' + DateToStr(Date)) ; kg_WriteStrings('m1',aStr,Reg) ; Reg.CloseKey ; end ; finally Reg.Free ; aStr.Free ; end ;...Reg := TRegistry.Create ; aStr:= TStringList.Create ; try if Reg.OpenKey('kg_ms',False) then begin kg_ReadStrings('m1',aStr,Reg) ; Reg.CloseKey ; { Clean up our mess by removing the key and value we created } Reg.DeleteValue('m1') ; Reg.DeleteKey('kg_ms') ; if aStr.Count >0 then {ListBox1.Items.Assign(aStr)} else {ListBox1.Items.Add('Operation failed') ;} end ; finally Reg.Free ; aStr.Free ; end ;
uses registry;
...procedure kg_ReadStrings(const valueName: string; aStrings: TStrings; oReg:TRegistry) ;
var
valueType : DWORD ;
valueLen : DWORD ;
p, buffer : PChar ;
begin
aStrings.Clear ;
SetLastError(RegQueryValueEx(oReg.CurrentKey, PChar(valueName),nil, @valueType,nil, @valueLen)) ;
if GetLastError = ERROR_SUCCESS then
if valueType = REG_MULTI_SZ then
begin
GetMem(buffer, valueLen) ;
try
RegQueryValueEx(oReg.CurrentKey, PChar(valueName), nil, nil, PBYTE(buffer), @valueLen) ;
p := buffer ;
while p^ <> #0 do
begin
aStrings.Add(p) ;
Inc(p, lstrlen(p) + 1)
end
finally
FreeMem(buffer)
end
end
else
raise ERegistryException.Create('String list expected')
else
raise Exception.Create('Unable read MULTI_SZ value')
end;procedure kg_WriteStrings(const valueName: string; aStrings: TStrings; oReg:TRegistry) ;
var
p, buffer : PChar ;
i : Integer ;
size : DWORD ;
begin
size := 0 ;
for i := 0 to aStrings.Count - 1 do
Inc(size, Length(aStrings [i]) + 1) ;
Inc (size) ;
GetMem(buffer, size) ;
try
p := buffer ;
for i := 0 to aStrings.count - 1 do
begin
lstrcpy(p, PChar(aStrings [i])) ;
Inc(p, lstrlen (p) + 1)
end;
p^ := #0 ;
SetLastError(RegSetValueEx(oReg.CurrentKey, PChar(valueName), 0, REG_MULTI_SZ, buffer, size)) ;
if GetLastError <> ERROR_SUCCESS then
raise Exception.Create('Unable to write MULTI_SZ value') ;
finally
FreeMem(buffer)
end
end;...
var
Reg : TRegistry ;
aStr: TStringList ;
begin
Reg := TRegistry.Create ;
aStr:= TStringList.Create ;try
if Reg.OpenKey('kg_ms',True) then
begin
aStr.Add('This is a test to see how to read and write') ;
aStr.Add('MULTI_SZ type to the system registry.') ;
aStr.Add('Infomation entered: ' + DateToStr(Date)) ;
kg_WriteStrings('m1',aStr,Reg) ;
Reg.CloseKey ;
end ;
finally
Reg.Free ;
aStr.Free ;
end ;...Reg := TRegistry.Create ;
aStr:= TStringList.Create ;
try
if Reg.OpenKey('kg_ms',False) then
begin
kg_ReadStrings('m1',aStr,Reg) ;
Reg.CloseKey ; { Clean up our mess by removing the key and value we created }
Reg.DeleteValue('m1') ;
Reg.DeleteKey('kg_ms') ; if aStr.Count >0 then
{ListBox1.Items.Assign(aStr)}
else
{ListBox1.Items.Add('Operation failed') ;}
end ;
finally
Reg.Free ;
aStr.Free ;
end ;