Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

A vueltas con el registro de Windows

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: A vueltas con el registro de Windows Responder citando

Ya pregunté en su momento algo parecido. He estado mirando los hilos del foro en los que se habla sobre el uso de TRegistry y no acabo de aclararme con el uso; y además, y como siempre, la ayuda de Builder es un pelín escueta. Mad

Voy con la consulta: Para configurar un programa, necesito encontrar (si existe) el servidor de correo saliente. Con el Regedit de Windows le he pedido que busque en mi máquina el valor SMTP Server, y me ha devuelto como vía de acceso al valor:
Cita:
HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager\Accounts\00000004

¿Como puedo, con un TRegistry u otro sistema, encontrar el dato contenido en esa clave? Quisiera hacer, si es posible, como si apretarar Ctrl+F en Regedit y perdirle que busque el valor SMTP Server. En mi maquina yo sé que tiene que devolver smtp.eresmas.com.

He probado con LoadKey, GetValueNames y otros métodos de TRegistry y o bien me dan error o no encuentro lo que quiero. Embarassed
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si lo que necesitas es leer los datos de la cuenta de correo predeterminada no necesitas "buscarla", la cosa es algo mas sencilla.

Bajo la clave "HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager\Accounts" pueden haber datos de varias cuentas de correo, news, etc.

Para saber justo cual es la predeterminada tenemos que mirar la clave "HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager" y dentro de ella el valor de "Default Mail Account", ese valor (p.ej.: 00000004) coincidirá con una de las ramas que hay bajo "...\Accounts", ya solo tenemos que leer la información de esa rama.

Aquí lo tienes en forma de código, el primer ejemplo es usando TRegistry, el segundo usando el API:
Código:
#include <registry.hpp>

TRegistry* reg(new TRegistry);

// Ponemos la clave raíz, aunque en este caso no seria necesario,
//   ya que por defecto si no la ponemos es HKEY_CURRENT_USER
reg->RootKey = HKEY_CURRENT_USER;

// Primero miramos que clave esta marcada como cuenta
//   de correo por defecto, ya que pueden haber varias,
//   nos devolverá algo como por ejemplo "00000004"
String sKeyBase = "Software\\Microsoft\\Internet Account Manager";
if (reg->OpenKey(sKeyBase, false))
{
    String sDefaultEmailKey = reg->ReadString("Default Mail Account");
    reg->CloseKey();

    // Ahora podemos leer los datos necesarios de la cuenta
    //   principal en este caso solo leemos el servidor SMTP ...
    String sAccountKey = sKeyBase + "\\Accounts\\" + sDefaultEmailKey;
    if (reg->OpenKey(sAccountKey, false))
    {
        String sSmtp = reg->ReadString("SMTP Server");
        ShowMessage(sSmtp);
    }
}

delete reg;

Código:
HKEY   hKey;
HKEY   keyRoot = HKEY_CURRENT_USER;
String sKeyBase = "Software\\Microsoft\\Internet Account Manager";

if (!RegOpenKeyEx(keyRoot, sKeyBase.c_str(), 0, KEY_READ, &hKey))
{
    char  buffer[256];
    DWORD size = sizeof(buffer);
    if (!RegQueryValueEx(hKey,"Default Mail Account",0,0,buffer,&size))
    {
        RegCloseKey(hKey);

        String sAccountKey = sKeyBase + "\\Accounts\\" + buffer;
        if (!RegOpenKeyEx(keyRoot,sAccountKey.c_str(),0,KEY_READ,&hKey))
        {
            size = sizeof(buffer);
            if (!RegQueryValueEx(hKey, "SMTP Server",
                    0, 0, buffer, &size))
            {
                ShowMessage(buffer); // buffer contiene el servidor smtp
                // Aquí podemos leer otros datos de la cuenta...
            }
            RegCloseKey(hKey);
        }
    }
}


Saludos:
 _Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: ¡De fábula! Responder citando

Funciona como un tiro Leo. Muchas gracias por la ayuda.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola

Ando también a vueltas con el registro.
en mi caso necesito comprobar la existencia de un valore binario con sus datos y si no esta crearlo

Por ejemplo, necesito saber si existe una carpeta (ruta) determinada y en ella el valor T con datos a9b7c2d8 ( no pongo los 0x) y si no existe crear la carpeta, el valor binario y sus datos

La he creado a mano y adaptandome este ejemplo de Leo la detecta de maravilla

Quisiera pedirle al maestro Leo una pequeña ayuda suplementaria y es que por favor pusiera un ejemplo de como añadir una ruta del registro un valor con sus datos

Gracias

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola,

Para saber si existe una key, tenemos la funcion KeyExists. Te pongo un ejemplo:

Código:

#include <Registry.hpp>

TRegistry *registro = new TRegistry;
registro->RootKey = HKEY_CURRENT_USER;

if (registro->KeyExists("software\\Adobe\\Adobe Acrobat\\7.0")==false)
{
    ShowMessage("El Adobe Acrobat version 7.0 no esta instalado");
}
else
{
    ShowMessage("El Adobe Acrobat version 7.0 esta instalado");
}
registro->CloseKey();
delete registro;



Una vez comprobado que existe la entrada que nos interesa, probamos a abrirla y leer su contenido, te pongo otro ejemplo:

Código:

#include <Registry.hpp>

TRegistry *registro = new TRegistry;
registro->RootKey = HKEY_CURRENT_USER;

if (registro->KeyExists("Software\\MiPrograma\\1.0")==true)
{   // Programa instalado
    if(registro->OpenKey("Software\\MiPrograma\\1.0",false))
    {
        Edit1->Text = registro->ReadString("Texto");
    }
}
registro->CloseKey();
delete registro;


El proceso de escritura es similar:

Código:

#include <Registry.hpp>

TRegistry *registro = new TRegistry;
registro->RootKey = HKEY_CURRENT_USER;

if (registro->KeyExists("Software\\MiPrograma\\1.0")==true)
{   // Programa instalado
    if(registro->OpenKey("Software\\MiPrograma\\1.0",true))
    {
        registro->WriteTime("Hora",Time());
        registro->WriteDate("Fecha",Date());
        registro->WriteString("Texto","Texto de prueba");
    }
}
registro->CloseKey();
delete registro;


Si vas a manejar datos en binario, tienes:

int ReadBinaryData (AnsiString Name, void * Buffer, int BufSize);
void WriteBinaryData (AnsiString Name, void * Buffer, int BufSize);

Puedes ampliar esta informacion con la ayuda del Builder.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias

Saludos

Phil
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Retomo este tema porque sigo teniendo problemas. He de decir en primer luagr que en mi equipo no tengo instaaldo ni Outlook ni Windows Live Mail por lo que las claves que me facilitó Leo no las tengo declaradas.

Además de SMTP Server ¿Podeis indicarme en que claves se guardan el usuario del correo predeterminado, el puerto del servidor, si usa o no clave (authMethod me parece que es en Thunderbird) y los otros datos necesarios para configurar un TIdSmtp? Gracias
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
me parece que es en Thunderbird

Thunderbird no guarda esta información en el registro como ya vimos en una contestación anterior, donde añado un pequeño ejemplo que espero que te sirva:

https://cppbuilder.es/viewtopic.php?t=14153
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias otra vez. La verdad es que soy bastante paliza y es que muchas cosas del registro no tengo ni idea de como van.

El problema que tengo (veo que me he explicado mal) es que no sé como encontrar las claves si el gestor de correo es Outlook ya que yo no lo tengo instalado.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
si el gestor de correo es Outlook

No he podido encontrar documentación de Microsoft sobre este tema, así que lo que he hecho es crear una cuenta en el Outlook 2010 y comprobar que es lo que hace con esos datos. Y he visto que los guarda en:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem

Como en el ejemplo sobre Thunderbird, esto solo pretender ser una pequeña base, por lo que solo lee el perfil que crea el Outlook por defecto, pueden existir más, observando el registro se puede ver fácilmente como averiguar el perfil por defecto en caso de que hayan varios. Cada perfil como en Thunderbird puede contener varias cuentas, y este ejemplo si lee la cuenta que tengamos seleccionada como predeterminada.

Tampoco tengo ni idea de si todas las versiones de Outlook lo guardan de la misma manera, yo lo he probado en el Office 2010 sobre Windows 7, y en este momento no puedo probarlo en otras versiones.

Simplemente añade el siguiente código en el OnClick de un botón para comprobar si te sirve:

Código:
    // Añadimos las cabeceras:  #include<memory>  #include<Registry.hpp>

    String server = "", user = "";
    bool useAuth = false;
    int port = 25;

    String key = "Software\\Microsoft\\Windows NT\\CurrentVersion"
                 "\\Windows Messaging Subsystem\\Profiles\\Outlook"
                 "\\9375CFF0413111d3B88A00104B2A6676";
    String keyDefAccountNum = "{ED475418-B0D6-11D2-8C3B-00104B2A6676}";

    // Abrimos el perfil que crea el Outlook por defecto
    std::auto_ptr<TRegistry> reg(new TRegistry);
    if (reg->OpenKeyReadOnly(key))
    {
        union { BYTE buf[1024];  int num;  wchar_t wstr[512]; };
        int sizeBuf = sizeof(buf);
        if (reg->ReadBinaryData(keyDefAccountNum, buf, sizeBuf))
        {
            key += Format("\\%.08d", ARRAYOFCONST((num)) );
            reg->CloseKey();
            reg->OpenKeyReadOnly(key);

            if (reg->ReadBinaryData("SMTP Server", buf, sizeBuf))
            {
                server = wstr;

                if (reg->ValueExists("SMTP Use Auth"))
                {
                    useAuth = reg->ReadBool("SMTP Use Auth");
                    if (useAuth)
                    {
                        bool ok = reg->ReadBinaryData("SMTP User", buf, sizeBuf);
                        if (!ok)
                            ok = reg->ReadBinaryData("POP3 User", buf, sizeBuf);
                        user = ok ? wstr : L"";
                    }
                }

                if (reg->ValueExists("SMTP Port"))
                    port = reg->ReadInteger("SMTP Port");
            }
        }
    }

    ShowMessage("server: " + server + "\nport: " + port
        + "\nuseAuth: " + (int)useAuth + "\nuser: " + user);

(Probado en el BCB4, 6 y 2010)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo. Eres un monstruo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Encontre como invocar el emvio de un maildesde linea de comandos
anexo ejemplo:

thunderbird -compose "to='john@example.com,kathy@example.com',cc='britney@example.com',subject='dinner',body='How about dinner tonight?',attachment='C:\temp\info.doc,C:\temp\food.doc
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.