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
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 22:35:26.


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