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


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 14 Nov, 2003 12:27 pm Asunto: Comprobar si el BDE está instalado |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 14 Nov, 2003 1:45 pm Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 14 Nov, 2003 4:11 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 16 Nov, 2003 11:23 pm Asunto: |
|
|
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 _________________
 |
|
| 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.
|