c# - mathworks - agregar path a matlab
¿Busca si está instalado un software de terceros, la ruta de instalación y el nombre del EXE? (1)
Método 1
Las claves de registro SOFTWARE / Microsoft / Windows / CurrentVersion / Uninstall proporcionan una lista de dónde están instaladas la mayoría de las aplicaciones:
Nota: No enumera todas las aplicaciones EXE en la PC, ya que algunas no requieren instalación.
En su caso, estoy bastante seguro de que CMG STARS aparecerá en la lista y podrá buscarlo iterando sobre todas las subclaves mirando el valor DisplayName y obteniendo el InstallLocation .
También tenga en cuenta que esta clave de registro de desinstalación existe en 3 lugares en el registro:
1. SOFTWARE / Microsoft / Windows / CurrentVersion / Desinstalar dentro de CurrentUser
2. SOFTWARE / Microsoft / Windows / CurrentVersion / Desinstalar dentro de LocalMachine
3. SOFTWARE / Wow6432Node / Microsoft / Windows / CurrentVersion / Desinstalar en LocalMachine
Aquí hay una clase que devuelve la ubicación instalada de una aplicación:
using Microsoft.Win32;
public static class InstalledApplications
{
public static string GetApplictionInstallPath(string nameOfAppToFind)
{
string installedPath;
string keyName;
// search in: CurrentUser
keyName = @"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall";
installedPath = ExistsInSubKey(Registry.CurrentUser, keyName, "DisplayName", nameOfAppToFind);
if (!string.IsNullOrEmpty(installedPath))
{
return installedPath;
}
// search in: LocalMachine_32
keyName = @"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall";
installedPath = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
if (!string.IsNullOrEmpty(installedPath))
{
return installedPath;
}
// search in: LocalMachine_64
keyName = @"SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall";
installedPath = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
if (!string.IsNullOrEmpty(installedPath))
{
return installedPath;
}
return string.Empty;
}
private static string ExistsInSubKey(RegistryKey root, string subKeyName, string attributeName, string nameOfAppToFind)
{
RegistryKey subkey;
string displayName;
using (RegistryKey key = root.OpenSubKey(subKeyName))
{
if (key != null)
{
foreach (string kn in key.GetSubKeyNames())
{
using (subkey = key.OpenSubKey(kn))
{
displayName = subkey.GetValue(attributeName) as string;
if (nameOfAppToFind.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return subkey.GetValue("InstallLocation") as string;
}
}
}
}
}
return string.Empty;
}
}
REF: modifiqué el código anterior desde aquí para devolver la ruta de instalación.
Método 2
También puede usar System Management .Net DLL para obtener InstallLocation, aunque es mucho más lento y crea mensajes de registro de eventos "Windows Installer reconfigured the product" para cada producto instalado en su sistema.
using System.Management;
ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
foreach (ManagementObject mo in mos.Get())
{
Debug.Print(mo["Name"].ToString() + "," + mo["InstallLocation"].ToString() + Environment.NewLine);
}
Obteniendo el nombre del EXE
Ninguno de los métodos anteriores te dice el nombre del ejecutable, sin embargo, es bastante fácil calcular iterando todos los archivos en la ruta de instalación y usando una técnica que analizo aquí para ver las propiedades del archivo para detectar el EXE con el correcto Descripción del archivo , por ejemplo:
private string GetFileExeNameByFileDescription(string fileDescriptionToFind, string installPath)
{
string exeName = string.Empty;
foreach (string filePath in Directory.GetFiles(installPath, "*.exe"))
{
string fileDescription = GetSpecificFileProperties(filePath, 34).Replace(Environment.NewLine, string.Empty);
if (fileDescription == fileDescriptionToFind)
{
exeName = GetSpecificFileProperties(filePath, 0).Replace(Environment.NewLine, string.Empty);
break;
}
}
return exeName;
}
Cualquiera de los métodos (1 o 2) que utilice le recomiendo que guarde la ubicación del nombre del exe para que solo realice esta operación una vez. En mi opinión, es mejor usar el Método 1 porque es más rápido y no crea todo el "Windows Installer reconfiguró el producto". registros de eventos.
Método alternativo usando un instalador
Si su aplicación se está instalando, puede encontrar dónde se encuentra CMG STARS durante la instalación. Usar Windows Installer para inventariar productos y parches :
Enumeración de productos
Use la función MsiEnumProductsEx para enumerar las aplicaciones de Windows Installer que están instaladas en el sistema. Esta función puede encontrar todas las instalaciones por máquina y las instalaciones por usuario de las aplicaciones (administradas y no administradas) para el usuario actual y otros usuarios en el sistema. Use el parámetro dwContext para especificar el contexto de instalación que se debe encontrar. Puede especificar cualquiera o cualquier combinación de los posibles contextos de instalación. Use el parámetro szUserSid para especificar el contexto de usuario de las aplicaciones que se encontrarán.
Durante la instalación, encontrará la ruta de acceso exe a CMG STARS y guardará una clave de registro con el valor.
Discuto el uso de este enfoque de guardar la ruta de instalación de un EXE en el registro para actualizar las aplicaciones aquí .
Propina
Como se mencionó en los comentarios, vale la pena hacer una búsqueda en el registro del nombre del archivo EXE st201110.exe y ver si los autores de la aplicación CMG STAR ya proporcionan esta información en una clave de registro a la que puede acceder directamente.
Plan B
Si todo lo demás falla, presente al usuario un FileOpenDialog y haga que especifiquen la ruta del exe de forma manual.
¿Qué pasa si la aplicación de terceros se desinstala o actualiza?
Mencioné que debo almacenar la ruta de instalación y el nombre del programa en el registro (o base de datos, archivo de configuración, etc.) y siempre debe verificar que exista el archivo exe antes de realizar llamadas externas, por ejemplo:
if (!File.Exists(installPath + exeName))
{
//Run through the process to establish where the 3rd party application is installed
}
Estoy haciendo un software en C # y MATLAB que llama a otro software (CMG) para hacer algo de procesamiento. Mi problema es que la dirección del software que puse en mi programa solo es correcta en mi computadora personal y no en las computadoras de los clientes (no sé cuál sería la ruta al software CMG en su computadora).
¿Cómo puedo proporcionar una forma general de la dirección para que funcione en todas las computadoras?
La siguiente es la ruta que llamo desde mi software MATLAB:
C:/Program Files (x86)/CMG/STARS/2011.10/Win_x64/EXE/st201110.exe
Como puede ver, está en la unidad C y la versión es 2011.10. Entonces, si la versión del cliente es otra cosa y está instalada en otras unidades, esta ruta no tiene sentido.