Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer un registro del sistema multistring (https://www.clubdelphi.com/foros/showthread.php?t=12374)

Javi2 14-07-2004 17:06:12

Leer un registro del sistema multistring
 
Hola,

Tengo un procedimiento que lee los registros del sistema utilizando los TRegistry pero me he tropezado con registros de tipo multistring, los cuales contienen en un mismo registro varias cadenas de informacion distintas (path, value,...). El caso es que para estos registros la función ReadString no funciona.

¿Alguien sabe como puedo leer cada uno de los strings que componen ese registro?.

Muchas gracias

roman 14-07-2004 17:26:57

¿Podrías darnos un ejemplo de este tipo de entradas para que podamos examinarlo?

// Saludos

Javi2 14-07-2004 19:11:13

Ejemplo
 
Por supuesto, si compartes una carpeta cualquiera o la conectas a una unidad de red, se genera en HKEY_LOCAL_MACHINE -> SYSTEM -> ControlSet001 -> Services -> lanmanserver -> Shares un registro de estas características para el recurso compartido. Me imagino que así lo podrás ver mejor que si lo escribo aqui manualmente.

Muchas gracias.

roman 14-07-2004 21:51:23

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

Javi2 15-07-2004 11:09:45

Muchisimas gracias
 
Muchas gracias, aunque como tu muy bien habias dicho, buscando se encuentra y eso es lo que hice y encontre un ejemplo similar al tuyo que tambien me soluciono el problema.

De todas formas, muchas gracias por el interes y perdon por las molestias


La franja horaria es GMT +2. Ahora son las 20:31:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi