Crear un DSN de MsAccess

//---------------------------------------------------------------------------
// CrearDSNAccess
//   Esta función crea un Nombre de Origen de Datos para poder establecer una
//   conexión via ODBC con una base de datos Access.
//   Si el DSN ya existe con anterioridad, se modifica la ruta al archivo MDB
//   si esta fuera diferente.
//
//   Parámetros:
//     stNombreDSN      : Nombre para el origen de datos
//     stDescripcion    : Descripción del origen de datos, puede ser una
//                        cadena vacia
//     stPathArchivoMDB : Ruta completa al archivo MDB
//     bEsSistema       : true si queremos crear un DSN de sistema o false si
//                        queremos un DSN de usuario
//
//   Notas: Es necesario incluir la cabecera "Registry.hpp"
//---------------------------------------------------------------------------
void CrearDSNAccess(String stNombreDSN, String stDescripcion,
                String stPathArchivoMDB, bool bEsSistema)
{
  TRegistry* reg = new TRegistry;

  try
  {
    // Escogemos si queremos un DSN de sistema o usuario
    if (bEsSistema)
      reg->RootKey = HKEY_LOCAL_MACHINE;
    else
      reg->RootKey = HKEY_CURRENT_USER;

    // Abrimos la clave que contiene las cadenas con los DSN instalados.
    reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\ODBC Data Sources", true);

    // Comprobamos si existe nuestro DSN, es decir, si al leer se devuelve ""
    // significa que el DSN no existe y hay que crearlo.
    if (reg->ReadString(stNombreDSN) == "")
    {
      // No existe una entrada para este DSN, por lo tanto hay que crearla.
      reg->WriteString(stNombreDSN, "Microsoft Access Driver (*.mdb)");

      // Creamos también una SubClave para contener los parámetros del DSN
      reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN, true);

      // Escribimos los datos necesarios
      reg->WriteString("DBQ", stPathArchivoMDB);
      reg->WriteString("Description", stDescripcion);

      // Tenemos que poner el path completo a la DLL odbcjt32.dll. Esta se
      // encuentra en el directorio Windows\System en Win9x/Me ó en
      // Winnt\System32 en NT/2000
      String stPathSystem = "";
      stPathSystem.SetLength(MAX_PATH);
      stPathSystem.SetLength(GetSystemDirectory(stPathSystem.c_str(), MAX_PATH));
      reg->WriteString("Driver", stPathSystem + "\\odbcjt32.dll");

      reg->WriteInteger("DriverId", 25);
      reg->WriteString("FIL", "MS Access");
      reg->WriteInteger("SafeTransactions", 0);
      reg->WriteString("UID", "");

      // Creamos otra subclave para contener más información propia del driver
      // de Access.
      reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN+"\\Engines\\Jet",
                    true);

      reg->WriteString("ImplicitCommitSync", "");
      reg->WriteInteger("MaxBufferSize", 2048);
      reg->WriteInteger("PageTimeout", 32);
      reg->WriteInteger("Threads", 3);
      reg->WriteString("UserCommitSync", "Yes");
    }
    else // El DSN ya existe.
    {
      // Abrimos la Subclave que contiene información sobre el DSN
      reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN, true);

      // Comprobamos si el path es el mismo para actualizarlo.
      if (reg->ReadString("DBQ") != stPathArchivoMDB)
        reg->WriteString("DBQ", stPathArchivoMDB);
    }
  }
  __finally
  {
    delete(reg);
  }
}