Ver Mensaje Individual
  #4  
Antiguo 14-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ok. El tipo de datos es REG_MULTI_SZ, esto es, cadenas de caracteres separadas por nulos (#0).

Estuve viendo los métodos de TRegistry y al parecer no hay uno (o no lo he visto) para leer este tipo de datos.

Pero buscando se encuentra

Te pongo la siguiente rutina ReadStrings para leer un valor de este tipo del registro:

Código Delphi [-]
{
  Convierte una lista de cadenas separadas
  por nulos en una lista normal de cadenas.
}
procedure SzStringsToStrings(const SzStrings: String; Strings: TStrings);
var
  NullPos: Integer;
  S: String;

begin
  S := SzStrings;
  while S <> '' do
  begin
    NullPos := Pos(#0, S);
    if NullPos <> 0 then
    begin
      Strings.Add(S);
      Delete(S, 1, NullPos);
    end
    else
      break;
  end;
end;

{
  Similar a Win32Check pero para funciones que
  regresan un entero.
}
procedure CheckApi(RetVal: Integer);
begin
  if RetVal <> ERROR_SUCCESS then
    RaiseLastOSError;
end;

{
  Lee un valor multilínea del registro
}
procedure ReadStrings(Root: HKey; Key, Value: String; Strings: TStrings);
var
  Data: String;
  Size: Integer;

begin
  with TRegistry.Create do
    try
      RootKey := Root;

      if OpenKey(Key, false) then
      begin
        { Obtener el tamaño que ocupa el dato }
        CheckApi(RegQueryValueEx(CurrentKey, PChar(Value), nil, nil, nil, @Size));
        SetLength(Data, Size);

        { Leer el dato }
        CheckApi(RegQueryValueEx(CurrentKey, PChar(Value), nil, nil, @Data[1], @Size));

        { Convertir el dato a TStrings }
        SzStringsToStrings(Data, Strings);
      end;
    finally
      Free;
    end;
end;

Un ejemplo de uso:

Código Delphi [-]
var
  Key: String;
  Value: String;

begin
  Key := 'System\ControlSet001\Services\lanmanserver\Shares';
  ReadStrings(HKEY_LOCAL_MACHINE, Key, 'Documentos', Memo1.Lines);
end;

// Saludos
Responder Con Cita