热情软件屋

 

Delphi下如何读写多字符串值(REG_MULTI_SZ类型)


编号:QA004705
建立日期: 2003年7月27日 最后修改日期:2003年8月2日
所属类别:

天兰一族·云:
    Delphi下如何读写多字符串值(REG_MULTI_SZ类型)的键值?结果定义为string类型,则使用readstring运行时提示读取的数据类型类型不对。结果定义为TstringList类型,则使用readstring,编译时提示类型不匹配?请问,如何读写?

回答:

    你可以参考一下http://www.thedelphimagazine.com/Samples/1655/1655.htm,其中的TForm1.Write_MULTI_SZ_Strings过程是个很好的例子。
    uses registry;
    const
     cCustomLog =
     'System\CurrentControlSet\Services\EventLog\Custom';
    type
     pArray = ^tArray;
     tArray = array[0..16383] of char;
    procedure TForm1.Write_MULTI_SZ_Strings(const valueName:
     string; strings: TStrings);
    var
     buffer: pArray;
     i, size: integer;
     TempKey: HKEY;
    begin
     size := 0;
     for i := 0 to strings.count - 1 do
     size := size + length(strings[i]) + 1;
     inc(size);
     GetMem (buffer, size);
     fillchar(buffer^, 0, size);
     try
     size := 0;
     for i := 0 to strings.count - 1 do begin
     move(strings[i][1],buffer^[size],length(strings[i]));
     inc(size, length(strings[i])+1);
     end;
     inc(size);
     if RegOpenKeyEx(HKEY_LOCAL_MACHINE, cCustomLog,
     0, KEY_WRITE, TempKey) = ERROR_SUCCESS then
     try
     if RegSetValueEx(TempKey, PChar(valueName),
     0, REG_MULTI_SZ, buffer, size) <> ERROR_SUCCESS then
     raise Exception.Create(
     'Unable to write MULTI_SZ value');
     finally
     RegCloseKey(TempKey);
     end;
     finally
     FreeMem (buffer)
     end
    end;
    procedure TForm1.Create_EventLog;
    var
     size: integer;
     s: string;
     TempKey: HKEY;
     fDisposition: pointer;
     fStrings: TStringlist;
    begin
     fDisposition := nil;
     if RegOpenKeyEx(HKEY_LOCAL_MACHINE, cCustomLog,
     0, KEY_READ, TempKey) <> ERROR_SUCCESS then begin
     if RegCreateKeyEx(HKEY_LOCAL_MACHINE, cCustomLog,
     0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil,
     TempKey, fDisposition) = ERROR_SUCCESS then begin
     s := '%SystemRoot%\system32\elsx.dll';
     size := length(s);
     RegSetValueEx (TempKey, 'DisplayNameFile',
     0, REG_EXPAND_SZ, pchar(s), size);
     // MessageTable string ID in elsx.dll
     // Used by Event Viewer
     size := 100;
     RegSetValueEx (TempKey, 'DisplayNameID',
     0, REG_DWORD, @size, sizeof(size));
     s := '%SystemRoot%\System32\config\CstEvent.Evt';
     size := length(s);
     RegSetValueEx (TempKey, 'File', 0, REG_EXPAND_SZ,
     pchar(s), size);
     size := $80000; // 512kb maximum log file size
     //$40000 = 256kb (262144) bytes
     RegSetValueEx (TempKey, 'MaxSize', 0, REG_DWORD,
     @size, sizeof(size));
     s := 'Custom';
     size := length(s);
     RegSetValueEx (TempKey, 'PrimaryModule', 0, REG_SZ,
     pchar(s), size);
     // number of seconds to keep messages before
     // automatically overwriting
     // Overwrite messages 7 or more days old
     size := 604800;
     // 604800 = 60/secs * 60/mins * 24/hrs * 7/days
     // $00000000 - means Overwrite as needed
     // $ffffffff - means never Overwrite
     RegSetValueEx (TempKey,
     'Retention',0,REG_DWORD,@size, sizeof(size));
     RegCloseKey(TempKey);
     fStrings := TStringlist.create;
     // define a known message source
     fStrings.add('UsgSoapServer');
     Write_MULTI_SZ_Strings('Sources', fStrings);
     fStrings.free;
     if RegCreateKeyEx(HKEY_LOCAL_MACHINE,
     cCustomLog+'\UsgSoapServer',
     0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE,
     nil, TempKey, fDisposition) = ERROR_SUCCESS
     then begin
     s := '%SystemRoot%\system32\elsx.dll';
     size := length(s);
     RegSetValueEx (TempKey, 'CategoryMessageFile', 0,
     REG_EXPAND_SZ, pchar(s), size);
     RegSetValueEx (TempKey, 'EventMessageFile', 0,
     REG_EXPAND_SZ, pchar(s), size);
     size := 4;
     RegSetValueEx (TempKey, 'CategoryCount', 0,
     REG_DWORD, @size, sizeof(size));
     size := 2;
     RegSetValueEx (TempKey, 'TypesSupported', 0,
     REG_DWORD, @size, sizeof(size));
     RegCloseKey(TempKey);
     end;
     end;
     end
     else
     RegCloseKey(TempKey);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Create_EventLog;
     // Log a event message just to prove that it works...
     with TEventLogger.create('UsgSoapServer') do
     try
     LogMessage('Stop', EVENTLOG_SUCCESS, $02, $67);
     finally
     free;
     end;
    end;
    

    
    天兰一族·云的意见:
    注册表类型全操作
    unit MiniReg;
    {
    ---------------------------------------------------------------------------------------------------
    
    
     Function Examples:
    
     procedure TForm1.Button1Click(Sender: TObject);
     var
     ba1, ba2: array of byte;
     n: integer;
     s: String;
     d: Cardinal;
     begin
     setlength(ba1, 10);
     for n := 0 to 9 do ba1[n] := byte(n);
    
     RegSetString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestString', 'TestMe');
     RegSetExpandString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestExpandString', '%SystemRoot%\Test');
     RegSetMultiString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestMultiString', 'String1'#0'String2'#0'String3');
     RegSetDword(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestDword', 7);
     RegSetBinary(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestBinary', ba1);
    
     To set the default value for a key, end the key name with a '\':
     RegSetString(HKEY_CURRENT_USER, 'Software\My Company\Test\', 'Default Value');
     RegGetString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestString', s);
     RegGetMultiString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestMultiString', s);
     RegGetExpandString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestExpandString', s);
     RegGetAnyString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestMultiString', s, StringType);
     RegSetAnyString(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestMultiString', s, StringType);
     RegGetDWORD(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestDword', d);
     RegGetBinary(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestBinary', s);
     SetLength(ba2, Length(s));
     for n := 1 to Length(s) do ba2[n-1] := byte(s[n]);
     Button1.Caption := IntToStr(Length(ba2));
    
     if RegKeyExists(HKEY_CURRENT_USER, 'Software\My Company\Test\foo') then
     if RegValueExists(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestBinary') then
     MessageBox(GetActiveWindow, 'OK', 'OK', MB_OK);
     RegDelValue(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar\TestString');
     RegDelKey(HKEY_CURRENT_USER, 'Software\My Company\Test\foo\bar');
     RegDelKey(HKEY_CURRENT_USER, 'Software\My Company\Test\foo');
     RegDelKey(HKEY_CURRENT_USER, 'Software\My Company\Test');
     RegDelKey(HKEY_CURRENT_USER, 'Software\My Company');
     if RegEnumKeys(HKEY_CURRENT_USER, 'Software\My Company', s) then
     ListBox1.Text := s;
     if RegEnumValues(HKEY_CURRENT_USER, 'Software\My Company', s) then
     ListBox1.Text := s;
     if RegConnect('\\server1', HKEY_LOCAL_MACHINE, RemoteKey) then
     begin
     RegGetString(RemoteKey, 'Software\My Company\Test\foo\bar\TestString', s);
     RegDisconnect(RemoteKey);
     end;
     end;
    ---------------------------------------------------------------------------------------------------
    }
    interface
    
    uses Windows;
    
    function RegSetString(RootKey: HKEY; Name: String; Value: String): boolean;
    function RegSetMultiString(RootKey: HKEY; Name: String; Value: String): boolean;
    function RegSetExpandString(RootKey: HKEY; Name: String; Value: String): boolean;
    function RegSetDWORD(RootKey: HKEY; Name: String; Value: Cardinal): boolean;
    function RegSetBinary(RootKey: HKEY; Name: String; Value: Array of Byte): boolean;
    function RegGetString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    function RegGetMultiString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    function RegGetExpandString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    function RegGetAnyString(RootKey: HKEY; Name: String; Var Value: String; Var ValueType: Cardinal): boolean;
    function RegSetAnyString(RootKey: HKEY; Name: String; Value: String; ValueType: Cardinal): boolean;
    function RegGetDWORD(RootKey: HKEY; Name: String; Var Value: Cardinal): boolean;
    function RegGetBinary(RootKey: HKEY; Name: String; Var Value: String): boolean;
    function RegGetValueType(RootKey: HKEY; Name: String; var Value: Cardinal): boolean;
    function RegValueExists(RootKey: HKEY; Name: String): boolean;
    function RegKeyExists(RootKey: HKEY; Name: String): boolean;
    function RegDelValue(RootKey: HKEY; Name: String): boolean;
    function RegDelKey(RootKey: HKEY; Name: String): boolean;
    function RegDelKeyEx(RootKey: HKEY; Name: String; WithSubKeys: Boolean = True): boolean;
    function RegConnect(MachineName: String; RootKey: HKEY; var RemoteKey: HKEY): boolean;
    function RegDisconnect(RemoteKey: HKEY): boolean;
    function RegEnumKeys(RootKey: HKEY; Name: String; var KeyList: String): boolean;
    function RegEnumValues(RootKey: HKEY; Name: String; var ValueList: String): boolean;
    
    implementation
    
    function LastPos(Needle: Char; Haystack: String): integer;
    begin
     for Result := Length(Haystack) downto 1 do
     if Haystack[Result] = Needle then
     Break;
    end;
    
    function RegConnect(MachineName: String; RootKey: HKEY; var RemoteKey: HKEY): boolean;
    begin
     Result := (RegConnectRegistry(PChar(MachineName), RootKey, RemoteKey) = ERROR_SUCCESS);
    end;
    
    function RegDisconnect(RemoteKey: HKEY): boolean;
    begin
     Result := (RegCloseKey(RemoteKey) = ERROR_SUCCESS);
    end;
    
    function RegSetValue(RootKey: HKEY; Name: String; ValType: Cardinal; PVal: Pointer; ValSize: Cardinal): boolean;
    var
     SubKey: String;
     n: integer;
     dispo: DWORD;
     hTemp: HKEY;
    begin
     Result := False;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if RegCreateKeyEx(RootKey, PChar(SubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, hTemp, @dispo) = ERROR_SUCCESS then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     if SubKey = '' then
     Result := (RegSetValueEx(hTemp, nil, 0, ValType, PVal, ValSize) = ERROR_SUCCESS)
     else
     Result := (RegSetValueEx(hTemp, PChar(SubKey), 0, ValType, PVal, ValSize) = ERROR_SUCCESS);
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegGetValue(RootKey: HKEY; Name: String; ValType: Cardinal; var PVal: Pointer; var ValSize: Cardinal): boolean;
    var
     SubKey: String;
     n: integer;
     MyValType: DWORD;
     hTemp: HKEY;
     Buf: Pointer;
     BufSize: Cardinal;
     PKey: PChar;
    begin
     Result := False;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     if SubKey = '' then
     PKey := nil
     else
     PKey := PChar(SubKey);
     if RegQueryValueEx(hTemp, PKey, nil, @MyValType, nil, @BufSize) = ERROR_SUCCESS then
     begin
     GetMem(Buf, BufSize);
     if RegQueryValueEx(hTemp, PKey, nil, @MyValType, Buf, @BufSize) = ERROR_SUCCESS then
     begin
     if ValType = MyValType then
     begin
     PVal := Buf;
     ValSize := BufSize;
     Result := True;
     end else
     begin
     FreeMem(Buf);
     end;
     end else
     begin
     FreeMem(Buf);
     end;
     end;
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegSetAnyString(RootKey: HKEY; Name: String; Value: String; ValueType: Cardinal): boolean;
    begin
     case ValueType of
     REG_SZ, REG_EXPAND_SZ:
     Result := RegSetValue(RootKey, Name, ValueType, PChar(Value + #0), Length(Value) + 1);
     Reg_MULTI_SZ:
     Result := RegSetValue(RootKey, Name, ValueType, PChar(Value + #0#0), Length(Value) + 2);
     else
     Result := False;
     end;
    end;
    
    function RegSetString(RootKey: HKEY; Name: String; Value: String): boolean;
    begin
     Result := RegSetValue(RootKey, Name, REG_SZ, PChar(Value + #0), Length(Value) + 1);
    end;
    
    function RegSetMultiString(RootKey: HKEY; Name: String; Value: String): boolean;
    begin
     Result := RegSetValue(RootKey, Name, REG_MULTI_SZ, PChar(Value + #0#0), Length(Value) + 2);
    end;
    
    function RegSetExpandString(RootKey: HKEY; Name: String; Value: String): boolean;
    begin
     Result := RegSetValue(RootKey, Name, REG_EXPAND_SZ, PChar(Value + #0), Length(Value) + 1);
    end;
    
    function RegSetDword(RootKey: HKEY; Name: String; Value: Cardinal): boolean;
    begin
     Result := RegSetValue(RootKey, Name, REG_DWORD, @Value, SizeOf(Cardinal));
    end;
    
    function RegSetBinary(RootKey: HKEY; Name: String; Value: Array of Byte): boolean;
    begin
     Result := RegSetValue(RootKey, Name, REG_BINARY, @Value[Low(Value)], length(Value));
    end;
    
    function RegGetString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
    begin
     Result := False;
     Value := '';
     if RegGetValue(RootKey, Name, REG_SZ, Buf, BufSize) then
     begin
     Dec(BufSize);
     SetLength(Value, BufSize);
     if BufSize > 0 then
     Move(Buf^, Value[1], BufSize);
     FreeMem(Buf);
     Result := True;
     end;
    end;
    
    function RegGetMultiString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
    begin
     Result := False;
     Value := '';
     if RegGetValue(RootKey, Name, REG_MULTI_SZ, Buf, BufSize) then
     begin
     Dec(BufSize);
     SetLength(Value, BufSize);
     if BufSize > 0 then
     Move(Buf^, Value[1], BufSize);
     FreeMem(Buf);
     Result := True;
     end;
    end;
    
    function RegGetExpandString(RootKey: HKEY; Name: String; Var Value: String): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
    begin
     Result := False;
     Value := '';
     if RegGetValue(RootKey, Name, REG_EXPAND_SZ, Buf, BufSize) then
     begin
     Dec(BufSize);
     SetLength(Value, BufSize);
     if BufSize > 0 then
     Move(Buf^, Value[1], BufSize);
     FreeMem(Buf);
     Result := True;
     end;
    end;
    
    function RegGetAnyString(RootKey: HKEY; Name: String; Var Value: String; Var ValueType: Cardinal): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
     bOK: Boolean;
    begin
     Result := False;
     Value := '';
     if RegGetValueType(Rootkey, Name, ValueType) then
     begin
     case ValueType of
     REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ:
     bOK := RegGetValue(RootKey, Name, ValueType, Buf, BufSize);
     else
     bOK := False;
     end;
     if bOK then
     begin
     Dec(BufSize);
     SetLength(Value, BufSize);
     if BufSize > 0 then
     Move(Buf^, Value[1], BufSize);
     FreeMem(Buf);
     Result := True;
     end;
     end;
    end;
    
    function RegGetDWORD(RootKey: HKEY; Name: String; Var Value: Cardinal): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
    begin
     Result := False;
     Value := 0;
     if RegGetValue(RootKey, Name, REG_DWORD, Buf, BufSize) then
     begin
     Value := PDWord(Buf)^;
     FreeMem(Buf);
     Result := True;
     end;
    end;
    
    function RegGetBinary(RootKey: HKEY; Name: String; Var Value: String): boolean;
    var
     Buf: Pointer;
     BufSize: Cardinal;
    begin
     Result := False;
     Value := '';
     if RegGetValue(RootKey, Name, REG_BINARY, Buf, BufSize) then
     begin
     SetLength(Value, BufSize);
     Move(Buf^, Value[1], BufSize);
     FreeMem(Buf);
     Result := True;
     end;
    end;
    
    function RegValueExists(RootKey: HKEY; Name: String): boolean;
    var
     SubKey: String;
     n: integer;
     hTemp: HKEY;
    begin
     Result := False;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     Result := (RegQueryValueEx(hTemp, PChar(SubKey), nil, nil, nil, nil) = ERROR_SUCCESS);
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegGetValueType(RootKey: HKEY; Name: String; var Value: Cardinal): boolean;
    var
     SubKey: String;
     n: integer;
     hTemp: HKEY;
     ValType: Cardinal;
    begin
     Result := False;
     Value := REG_NONE;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if (RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS) then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     if SubKey = '' then
     Result := (RegQueryValueEx(hTemp, nil, nil, @ValType, nil, nil) = ERROR_SUCCESS)
     else
     Result := (RegQueryValueEx(hTemp, PChar(SubKey), nil, @ValType, nil, nil) = ERROR_SUCCESS);
     if Result then
     Value := ValType;
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegKeyExists(RootKey: HKEY; Name: String): boolean;
    var
     hTemp: HKEY;
    begin
     Result := False;
     if RegOpenKeyEx(RootKey, PChar(Name), 0, KEY_READ, hTemp) = ERROR_SUCCESS then
     begin
     Result := True;
     RegCloseKey(hTemp);
     end;
    end;
    
    function RegDelValue(RootKey: HKEY; Name: String): boolean;
    var
     SubKey: String;
     n: integer;
     hTemp: HKEY;
    begin
     Result := False;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     Result := (RegDeleteValue(hTemp, PChar(SubKey)) = ERROR_SUCCESS);
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegDelKey(RootKey: HKEY; Name: String): boolean;
    var
     SubKey: String;
     n: integer;
     hTemp: HKEY;
    begin
     Result := False;
     n := LastPos('\', Name);
     if n > 0 then
     begin
     SubKey := Copy(Name, 1, n - 1);
     if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then
     begin
     SubKey := Copy(Name, n + 1, Length(Name) - n);
     Result := (RegDeleteKey(hTemp, PChar(SubKey)) = ERROR_SUCCESS);
     RegCloseKey(hTemp);
     end;
     end;
    end;
    
    function RegDelKeyEx(RootKey: HKEY; Name: String; WithSubKeys: Boolean = True): boolean;
    const
     MaxBufSize: Cardinal = 1024;
    var
     iRes: integer;
     hTemp: HKEY;
     Buf: String;
     BufSize: Cardinal;
    begin
     Result := False;
     // no root keys...
     if pos('\', Name) <> 0 then
     begin
     iRes := RegOpenKeyEx(RootKey, PChar(Name), 0, KEY_ENUMERATE_SUB_KEYS or KEY_WRITE, hTemp);
     if WithSubKeys then
     begin
     while iRes = ERROR_SUCCESS do
     begin
     BufSize := MaxBufSize;
     SetLength(Buf, BufSize);
     iRes := RegEnumKeyEx(hTemp, 0, @Buf[1], BufSize, nil, nil, nil, nil);
     if iRes = ERROR_NO_MORE_ITEMS then
     begin
     RegCloseKey(hTemp);
     Result := (RegDeleteKey(RootKey, PChar(Name)) = ERROR_SUCCESS);
     end else
     begin
     if iRes = ERROR_SUCCESS then
     begin
     SetLength(Buf, BufSize);
     if RegDelKeyEx(RootKey, Concat(Name, '\', Buf), WithSubKeys) then
     iRes := ERROR_SUCCESS
     else
     iRES := ERROR_BADKEY;
     end;
     end;
     end;
     end else
     begin
     RegCloseKey(hTemp);
     Result := (RegDeleteKey(RootKey, PChar(Name)) = ERROR_SUCCESS);
     end;
     end;
    end;
    
    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;
    
    function RegEnumValues(RootKey: HKEY; Name: String; var ValueList: String): boolean;
    begin
     Result := RegEnum(RootKey, Name, ValueList, False);
    end;
    
    function RegEnumKeys(RootKey: HKEY; Name: String; var KeyList: String): boolean;
    begin
     Result := RegEnum(RootKey, Name, KeyList, True);
    end;
    
    end.
    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, Delphi, VCL, Borland, Windows API, win32, api, windows api, gdi32, kernel

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio