Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 23-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-10-2013 a las 14:20:08. Razón: sintáxis
Responder Con Cita
  #3  
Antiguo 23-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 23-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
Archivos Adjuntos
Tipo de Archivo: zip Angel_Matilla.zip (468,7 KB, 9 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-10-2013 a las 20:28:56.
Responder Con Cita
  #5  
Antiguo 23-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias. Probaré este código y ya os diré como ha ido.
Responder Con Cita
  #6  
Antiguo 24-10-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Es posible que exista un problema de permisos. Revísalos.

Saludos.
Responder Con Cita
  #7  
Antiguo 24-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Es posible que exista un problema de permisos. Revísalos.
No, estoy entrando como administrador del equipo.
Responder Con Cita
  #8  
Antiguo 24-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 25-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 25-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
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
Responder Con Cita
  #11  
Antiguo 25-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Además de eso Antonio, me preocupa lo de "el moderador" ... ¿ Están haciendo reducción de personal ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-10-2013 a las 13:02:57.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Leer datos del registro de windows dmartinezn C++ Builder 5 02-11-2012 14:48:29
insertar registro en clave foraneas chalo Lazarus, FreePascal, Kylix, etc. 3 20-09-2011 09:24:28
escribir y leer clave regedit ingmichel Internet 3 05-05-2010 18:14:46
Insertar una nueva clave en el Registro de Windows tipo REG_DWORD Ermek API de Windows 3 27-07-2006 12:29:40
Clave de registro para instaladores El_Chava Noticias 0 27-06-2005 03:28:16


La franja horaria es GMT +2. Ahora son las 18:02:39.


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
Copyright 1996-2007 Club Delphi