Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   No puedo leer una clave del registro Windows (https://www.clubdelphi.com/foros/showthread.php?t=84476)

Angel.Matilla 23-10-2013 13:15:26

No puedo leer una clave del registro Windows
 
A ver: ¿Qué estoy haciendo mal?
Código:

#include <registry>

TRegistry *rRegistro = new TRegistry();

rRegistro->RootKey = HKEY_LOCAL_MACHINE;
if (rRegistro->OpenKeyReadOnly("SOFTWARE\\Firebird Project\\Firebird Server\\Instances"))
{
    cAux = rRegistro->ReadString("DefaultInstance");
    rRegistro->CloseKey();
}

Al llegar al if no se ejecuta y ¡puedo prometer que la clave existe!

ecfisa 23-10-2013 14:09:31

Hola Angel.

No parece que estes haciendo nada mal , acabo de probar con código equivalente y muestra el valor de modo correcto:
Código:

#include <registry.hpp>  // ( Revisa esto )

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TRegistry *reg = new TRegistry(KEY_READ); //[*]
  String cAux;
  __try {
    reg->RootKey = HKEY_LOCAL_MACHINE;
    if (reg->OpenKeyReadOnly("SOFTWARE\\Firebird Project\\Firebird Server\\Instances")) {
      cAux = reg->ReadString("DefaultInstance");
      reg->CloseKey();
      ShowMessage(cAux);
    }
  }
  __finally {
    delete (reg);
  }
}

[*] Es costumbre, funciona igualmente como está en tu código.

Para que salgas de todad duda, también podes hacer la prueba desde consola:
Código:

#include<iostream>
#include<windows.h>
#include<registry.hpp>

int main()
{
  TRegistry *reg = new TRegistry(KEY_READ);
  String cAux;
  __try {
    reg->RootKey = HKEY_LOCAL_MACHINE;
    if (reg->OpenKeyReadOnly("SOFTWARE\\Firebird Project\\Firebird Server\\Instances")) {
      cAux = reg->ReadString("DefaultInstance");
      reg->CloseKey();
      std::cout << cAux;
    }
  }
  __finally {
    delete(reg);
  }
  std::cin.get();
}

Saludos :)

Angel.Matilla 23-10-2013 17:43:16

Gracias por la respuesta.
1. El include esta bien puesto (registry.hpp); no sé por qué a veces me quita las extensiones.
2. He probado añadiendo una línea en el código:
Código:

bool lPrueba = rRegistro->KeyExists("SOFTWARE\\Firebird Project\\Firebird Server\\Instances");
para probar si existe o no la clave y me devuelve false. Mi no comprender; si exporto esa rama de la clave a un fichero de texto con regedit me devuelve esto:
Cita:

Nombre de clave: HKEY_LOCAL_MACHINE\SOFTWARE\Firebird Project\Firebird Server\Instances
Nombre de clase: <Ninguna clase>
Hora de última escritura: 18/09/2013 - 12:04
Valor 0
Nombre: DefaultInstance
Tipo: REG_SZ
Datos: C:\Program Files\Firebird\Firebird_2_5\
Pero el programa, que está hecho con C++ Builder 6 (esto no lo dije), me dice que no existe. Deduzco, a la vista de esta información, que existe.

Voy más allá. He probado con este otro código:
Código:

HKEY  hKey;
HKEY  keyRoot = HKEY_LOCAL_MACHINE;
String sKeyBase = "SOFTWARE\\Firebird Project\\Firebird Server\\Instances";

if (RegOpenKeyEx(keyRoot, sKeyBase.c_str(), 0, KEY_READ, &hKey))
{
    char  buffer[256];
    DWORD size = sizeof(buffer);
    if (RegQueryValueEx(hKey, "DefaultInstance", 0, 0, buffer, &size))
          ShowMessage(buffer);
    RegCloseKey(hKey);
}

Este sí se ejecuta, pero me devuelve una cadena vacía; en este último caso ¿puede ser que esté definiendo mal las variables?

ecfisa 23-10-2013 19:15:37

1 Archivos Adjunto(s)
Hola Angel.

Tal como te comenté, la prueba que realicé funciona correctamente, no me explico por que no lo hace en tu caso... Te adjunto los fuentes de la misma para que la puedas revisar con tranquilidad.

En cuanto al uso de API, funciona correctamente de este modo:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HKEY  hKey;
  char Buffer[1024];
  DWORD dwBufSize = sizeof(Buffer);
  DWORD dwError;

  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                  "SOFTWARE\\Firebird Project\\Firebird Server\\Instances",
                  0,
                  KEY_READ,
                  &hKey) == ERROR_SUCCESS) {
    dwError = RegQueryValueEx(hKey,
                              "DefaultInstance",
                              0,
                              0,
                              Buffer,
                              &dwBufSize);
    if(dwError == ERROR_SUCCESS)
      ShowMessage((String)Buffer);
    else
      ShowMessage("No se pudo consultar la clave. \nCodigo de error: "+IntToStr(dwError));     
    RegCloseKey(hKey);
  }
}

(Ambos códigos fueron compilados en C++ Builder 6 sobre Windows 8)

Saludos :)

Angel.Matilla 23-10-2013 19:24:05

Gracias. Probaré este código y ya os diré como ha ido.

escafandra 24-10-2013 08:15:53

Es posible que exista un problema de permisos. Revísalos.

Saludos.

Angel.Matilla 24-10-2013 08:54:53

Cita:

Empezado por escafandra (Mensaje 468892)
Es posible que exista un problema de permisos. Revísalos.

No, estoy entrando como administrador del equipo.

Angel.Matilla 24-10-2013 11:24:02

Nada. Con ninguno de los códigos que hay en el hilo logro que me devuelva el valor que necesito, que no es otro que la carpeta en la que está instalado Firebird. O no me abre la clave o me devuelve una cadena vacía. Ya no sé que hacer.

Angel.Matilla 25-10-2013 10:33:44

Bueno, la solución me la ha dado el moderador del Club Builder, así que todo el mérito para él. Este es el código:
Código:

#include<memory>
#include<registry.hpp>

// Estas 3 líneas no son necesarias en versiones actuales
#ifndef KEY_WOW64_64KEY
    #define KEY_WOW64_64KEY (0x0100)
#endif

// En versiones más actuales podemos cambiar "auto_ptr" por "unique_ptr"
std::auto_ptr<TRegistry> rRegistro(new TRegistry(KEY_READ | KEY_WOW64_64KEY));
String cAux = "<?>";

rRegistro->RootKey = HKEY_LOCAL_MACHINE;
if (rRegistro->OpenKey("SOFTWARE\\Firebird Project\\Firebird Server\\Instances", false))
    cAux = rRegistro->ReadString("DefaultInstance");

ShowMessage(cAux);

Hay que tener en cuenta, y eso no me había dado cuenta de comentarlo (perdón, perdón :(), que estoy hablando de Firebird de 64 bits sobre Windows 7.

Casimiro Notevi 25-10-2013 10:56:34

Cita:

Empezado por Angel.Matilla (Mensaje 468929)
Bueno, la solución me la ha dado el moderador del Club Builder, así que todo el mérito para él. Este es el código:
Hay que tener en cuenta, y eso no me había dado cuenta de comentarlo (perdón, perdón :(), que estoy hablando de Firebird de 64 bits sobre Windows 7.

Bueno, bueno... así el mérito no es que sea para él, es que si nos 'escondes' información ;), así que castigo con penitencia para ti :p

ecfisa 25-10-2013 12:54:03

Cita:

Empezado por Casimiro Notevi (Mensaje 468932)
Bueno, bueno... así el mérito no es que sea para él, es que si nos 'escondes' información ;), así que castigo con penitencia para ti :p

Además de eso Antonio, me preocupa lo de "el moderador" :eek:... ¿ Están haciendo reducción de personal ? :D

Saludos :)


La franja horaria es GMT +2. Ahora son las 00:29:15.

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