中的REG_MULTI_SZ是个什么类型?用哪种数据类型写入 ?

解决方案 »

  1.   

    多字符串值
    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 ;