 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 11 Jun, 2003 8:49 am Asunto: A vueltas con el registro de Windows |
|
|
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.
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.  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 11 Jun, 2003 2:12 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Dom 14 Ene, 2007 2:26 pm Asunto: |
|
|
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 |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Jue 18 Ene, 2007 6:34 pm Asunto: |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Lun 29 Ene, 2007 8:14 am Asunto: |
|
|
Gracias
Saludos
Phil |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Sab 12 Feb, 2011 5:18 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 13 Feb, 2011 10:57 pm Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 14 Feb, 2011 8:04 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 16 Feb, 2011 3:49 am Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Vie 11 Mar, 2011 2:17 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|