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 

Comprobar si el BDE está instalado

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Comprobar si el BDE está instalado Responder citando

Me gustaría saber si hay alguna rutina que compruebe si el BDE está instalado o no en un determinado equipo. Es para evitar que cada vez que se instala uno de mis programa el BDE también se instale forzosamente siendo absurda la instalación del BDE si es que ya está instalado.
Gracias.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Método 1:
Código:
//--- Añadimos: #include<bde.hpp>

bool BdeInstalado(void)
{
    return DbiInit(0) == DBIERR_NONE;
}


Método 2:
Código:
//--- Añadimos: #include<registry.hpp> y #include<memory>

bool BdeInstalado(void)
{
    std::auto_ptr<TRegistry> reg(new TRegistry);
    reg->RootKey = HKEY_LOCAL_MACHINE;
    bool bBdeInstalado =
        reg->OpenKey("\\Software\\Borland\\Database Engine", false)
        && FileExists(IncludeTrailingBackslash(reg->ReadString("DLLPATH"))
        + "idapi32.dll");
    return bBdeInstalado;
}


Probado con BCB6+Upd4 en Windows 95, 98, Millenium y XP.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo, voy a inclinarme por el primer método dado que es más escueto y además parece que funciona a la perfección. Digo parece porque hasta ahora sólo lo he provado en un equipo que si tiene el BDE instalado y voy a tener que esperar a darle un fomateo a provarlo sin el BDE ya que no conozco otra forma de desinstalarlo. Utilizo tu función del siguiente modo:
//declaro la función:
bool BdeInstalado(void)
{
return DbiInit(0) == DBIERR_NONE;
}
//------y en el onclick de un botón:------
if (BdeInstalado()){
ShowMessage("Está instalado.");
}
else {
ShowMessage("No está instalado.");
}
//Saludos.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esto fue echo, con la ayuda de _LEO, quien te escribe la funcion arriba, con un detalle, le cambie el (0), por (NULL), y tambien funciona...
Código:

/**********METODO DOS PARA EL BDE*******************************/
bool BdeInstalado2(void)
  {
      return ( DbiInit(NULL) == DBIERR_NONE );
  }


Despues realice lo siguiente..., cuando verifique con un boton, si estaba o no instalado...
Código:

  if(!BdeInstalado2()){
        WinExecAndWait32("regsvr32 BDE\\BdeInst.dll", SW_SHOWDEFAULT   );
  }


la DLL, vien en el paquete de borland, de instalacion, y la puedes copiar al directorio principal de tu apliacion,, la otra funcion, me permite, que hasta que no este instalado, no se ejecute cual quier otra cosa, claro dejando libre los mensajes de windows para procesar otras tareas
la funcion es esta WinExecAndWait32(...), te pongo el codigo por site sirve, Instala algo, y hasta que no termine, no continua con la ejecusion del programa..


Código:

int WinExecAndWait32(AnsiString FileName, int Visibility)
{
  char zAppName[512];
  char zCurDir[255];
  AnsiString WorkDir;
  TStartupInfo StartupInfo;
  TProcessInformation ProcessInfo;

  strcpy(zAppName, FileName.c_str());
  WorkDir = GetCurrentDir();
  strcpy(zCurDir, WorkDir.c_str());
  setmem(&StartupInfo, sizeof(StartupInfo), 0);

  StartupInfo.cb = sizeof(StartupInfo);
  StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow = Visibility;

  if (!CreateProcess(NULL, zAppName, // pointer to command line string
    NULL, // pointer to process security attributes
    NULL, // pointer to thread security attributes
    false, // handle inheritance flag
    CREATE_NEW_CONSOLE | // creation flags
    NORMAL_PRIORITY_CLASS,
    NULL, // pointer to new environment block
    NULL, // pointer to current directory name
    &StartupInfo, // pointer to STARTUPINFO
    &ProcessInfo))
{
  return -1; // pointer to PROCESS_INF
}
  else
  {
  WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
  DWORD ExitCode;
  GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode);
  return ExitCode;
  }
}
/******************************************/

si alguien ve el codigo, y es de su propiedad, pido disculpas, pero en verdad funciona y mucho... y creo que a muchos nos puede interesar esta actividad...

saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email 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.