none
Directorio de una programa

    Pregunta

  • Hola a todos:

    Preciso comprobar si existe sql compact instalado en un ordenador y si no darle la opción al usuario de realizar la instalación.

    Todo eso es correcto pero no se como podría indicarle a la instalación que busque si el directorio del programa no está en "C". Hasta ahora lo he hecho así, sin probar ya que tampoco tengo claro si el directorio de mi aplicación no es "C" que lo busque con el DataDirectory. El problema se plantea cuando el directorio no es "C", imaginemos un servidor por ejemplo.

    Os pongo el código:

     Private Shared Sub ComprobarInstalaciónSqlCompact()
            Dim respuesta As DialogResult
    
            Dim ruta, ruta1 As String
            ruta = "C:\Program Files\Microsoft SQL Server Compact Edition\v4.0"
            ruta1 = "C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0"
    
            If Directory.Exists(ruta) OrElse Directory.Exists(ruta1) Then
                'No hacemos nada si el direcotrio existe
                'MessageBox.Show("El directorio existe")
            Else
                respuesta = MessageBox.Show("Necesita el motor de base de datos 'SqlServer Compact 4.0", vbCrLf &
                                "¿Quiere proceder a su instalación?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
    
                If respuesta = System.Windows.Forms.DialogResult.Cancel Then
                    Return
                    End
                Else
                    If ((MicrosoftAceHelper.Is64BitProcess) AndAlso
                    ((MicrosoftAceHelper.Is64BitOperatingSystem) OrElse (MicrosoftAceHelper.IsIA64OperatingSystem))) Then
                        Dim proces As New Process()
                        proces.StartInfo.FileName = “|DataDirectory|\FinancialSystem\bin\Debug\InstalacionSQLCompact4.0\SSCERuntime_x64-ESN.exe”
                        proces.Start()
                    ElseIf (MicrosoftAceHelper.Is32BitProcess) Then
                        Dim proces As New Process()
                        proces.StartInfo.FileName = “|DataDirectory|\FinancialSystem\bin\Debug\InstalacionSQLCompact4.0\SSCERuntime_x86-ESN.exe”
                        proces.Start()
                    End If
                End If
            End If
    
        End Sub

    Estoy un poco liada con este tema, pero quiero facilitarle al usuario la instalación si no la tiene.

    Muchas gracia s a todos.

    Gemma

    viernes, 28 de octubre de 2016 18:05

Respuestas

  • No es buena idea usar esa técnica para ver si está instalado, porque podría estar no solo un disco distinto, sino también una carpeta completamente distinta, en lugar de Program Files.

    Hay un par de técnicas para examinar la lista de programas instalados: una es enumerar en el Registro de Windows el contenido de la clave "Uninstall". Es algo más o menos parecido a lo siguiente:

    string clave = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(clave))
    {
        foreach (string subclave in key.GetSubKeyNames())
        {
            using (RegistryKey rk = key.OpenSubKey(subclave))
            {
                string programa = rk.GetValue("DisplayName");
                // Aquí comparas si "programa" es el que estabas buscando
            }
        }
    }


    La otra técnica consiste en usar WMI, lanzando un "select" sobre Win32_Product. Más o menos así:

    ManagementObjectSearcher mosrch = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
    foreach(ManagementObject mo in mosrch.Get())
    {
        string programa = mo["Name"];
        // comparar programa
    }

    En lugar de recorrerlos todos con un bucle, también puedes ponerle un "where" a la "select".

    • Marcado como respuesta gemma_campillo viernes, 28 de octubre de 2016 19:57
    viernes, 28 de octubre de 2016 19:45

Todas las respuestas

  • No es buena idea usar esa técnica para ver si está instalado, porque podría estar no solo un disco distinto, sino también una carpeta completamente distinta, en lugar de Program Files.

    Hay un par de técnicas para examinar la lista de programas instalados: una es enumerar en el Registro de Windows el contenido de la clave "Uninstall". Es algo más o menos parecido a lo siguiente:

    string clave = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(clave))
    {
        foreach (string subclave in key.GetSubKeyNames())
        {
            using (RegistryKey rk = key.OpenSubKey(subclave))
            {
                string programa = rk.GetValue("DisplayName");
                // Aquí comparas si "programa" es el que estabas buscando
            }
        }
    }


    La otra técnica consiste en usar WMI, lanzando un "select" sobre Win32_Product. Más o menos así:

    ManagementObjectSearcher mosrch = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
    foreach(ManagementObject mo in mosrch.Get())
    {
        string programa = mo["Name"];
        // comparar programa
    }

    En lugar de recorrerlos todos con un bucle, también puedes ponerle un "where" a la "select".

    • Marcado como respuesta gemma_campillo viernes, 28 de octubre de 2016 19:57
    viernes, 28 de octubre de 2016 19:45
  • Hola Alberto:

    Voy a optar por la primera, me defiendo mejor porque ya tengo alguna cosa hecha así más o menos.

    Efectivamente ahí me sale en el registro el SqlCompact y el CrystalReports que son los dos que necesito, voy a ver si me las arreglo con lo que me has explicado.

    Te agradezco como siempre tu ayuda, da gusto trabajar con vosotros.

    Un fuerte abrazo.

    Gemma

    viernes, 28 de octubre de 2016 19:57