Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   RegQueryValue que hago mal? (https://www.clubdelphi.com/foros/showthread.php?t=35961)

Thor 27-09-2006 12:55:58

RegQueryValue que hago mal?
 
Hola, intentaba acceder al registro con la función del título con este código:
Código Delphi [-]
var
  NewKey: Hkey;
  Buffer: array[0..32765] of char;
  i: integer;
  bytesread: integer;
begin
  bytesread := 0;
  if RegOpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\A', NewKey) = ERROR_SUCCESS then
  begin
    i := RegQueryValue(NewKey, 'ejem', nil, bytesread);
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, i, 0, buffer, 32765, nil);
    ShowMessage(buffer);
  end
  else
    ShowMessage('Error al acceder a la clave');
end;
Me he mirado la documentación de msdn y ejemplos que he encontrado por la red, pero al ejecutarlo y gracias a FormatMessage me muestra el error:
"El sistema no puede hallar el archivo especificado"
Y existe el valor "ejem" en la clave HKEY_LOCAL_MACHINE\SOFTWARE\A

Según la documentación de msdn con el tercer parametro de RegQueryValue a nil se deberia guardar en bytesread la longitud de el valor que voy a leer, pero siempre esa longitud vale cero.

No es que busque otro camino para hacer lo mismo, ya que con RegQueryValueEx si que consigo acceder al valor, sino que me gustaría por qué así no funciona.

Gracias y saludos.

seoane 27-09-2006 15:24:25

:mad: Maldita pregunta casi me vuelve loco, yo tampoco entendía que hacías mal. Yo mismo lo haría igual, y efectivamente con RegQueryValueEx funciona perfectamente. Pero ya encontré la explicación, y es una tontería:

Primero debemos fijarnos en una cosa, la ayuda dice de la función RegOpenKeyEx:
Cita:

This function retrieves the data for a key's first value that has a NULL name
Es decir, no puede leer los valores que hay dentro de una clave, solo es capaz de leer el valor por defecto (Predeterminado). El parametro lpSubKey solo puede ser otra CLAVE, nil, o una cadena vacia. Es decir:

Código Delphi [-]
// Se puede hacer esto
RegQueryValue(NewKey,'', nil, bytesread);
// O tambien
RegQueryValue(NewKey,nil, nil, bytesread);
// Incluso se puede hacer esto otro
RegOpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE', NewKey);
RegQueryValue(NewKey,'A', nil, bytesread);

Es decir no puede leer otro valor distinto del predeterminado, esta función solo se incluye por compatibilidad con Windows 3.1, por eso es tan limitada.

:D Que agusto me quede ...

Thor 27-09-2006 15:55:45

Que agusto me he quedado yo tambien, casi me vuelvo loco !, muchisimas gracias por resolverlo.
Saludos seoane.


La franja horaria es GMT +2. Ahora son las 22:46:57.

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