gpt4 book ai didi

c# - 如何找到 EXE 的安装位置 - 正确的方法?

转载 作者:可可西里 更新时间:2023-11-01 12:40:44 24 4
gpt4 key购买 nike

我正在用 C# 和 MATLAB 制作一个软件,它调用另一个软件 (CMG) 来进行一些处理。我的问题是我放入程序中的软件地址只在我的个人电脑上正确,在客户的电脑上不正确(我不知道 CMG 软件在他们的电脑上的路径是什么)。

我怎样才能提供地址的一般形式以使其适用于每台计算机?

以下是我从我的MATLAB软件中调用的路径:

C:\Program Files (x86)\CMG\STARS\2011.10\Win_x64\EXE\st201110.exe

如你所见,它在C盘,版本是2011.10。因此,如果客户的版本是其他版本并且安装在其他驱动器上,则此路径没有意义。

最佳答案

方法一

注册表项 SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 提供了大多数应用程序安装位置的列表:

enter image description here

注意:它没有列出 PC 上的所有 EXE 应用程序,因为有些应用程序不需要安装。

在你的情况下,我很确定 CMG STARS 将被列出,你将能够通过遍历所有查看 DisplayName 值并获取 InstallLocation< 的子项来搜索它/strong>.

另请注意,此卸载注册表项存在于注册表中的 3 个位置:
1. SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall in CurrentUser
2. SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall inside LocalMachine
3.SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\LocalMachine中的Uninstall

这是一个返回应用程序安装位置的类:

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;
}
}

这是你如何调用它:

string installPath = InstalledApplications.GetApplictionInstallPath(nameOfAppToFind);

要获取 nameOfAppToFind,您需要在注册表中查看 DisplayName:

enter image description here

REF: 我从 here 修改了上面的代码返回安装路径。


方法二

您还可以使用系统管理 .Net DLL 来获取 InstallLocation,尽管它的速度非常慢,并且会为您系统上安装的每个产品创建“Windows Installer 重新配置产品”事件日志消息。

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);
}

获取EXE的名称

上述方法都不会告诉您可执行文件的名称,但是通过遍历安装路径中的所有文件并使用我讨论的技术 here to look at file properties 很容易计算出来。 以检测具有正确文件描述 的 EXE,例如:

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;
}

enter image description here


无论您使用哪种方法(1 或 2),我都建议您保存 exe 名称的位置,这样您只需执行一次此操作。在我看来,最好使用方法 1,因为它更快并且不会创建所有“Windows Installer 重新配置产品”。事件日志。


使用安装程序的替代方法

如果正在安装您的应用程序,您可以在安装过程中找到 CMG STARS 所在的位置 Using Windows Installer to Inventory Products and Patches :

Enumerating Products
Use the MsiEnumProductsEx function to enumerate Windows Installer applications that are installed in the system. This function can find all the per-machine installations and per-user installations of applications (managed and unmanaged) for the current user and other users in the system. Use the dwContext parameter to specify the installation context to be found. You can specify any one or any combination of the possible installation contexts. Use the szUserSid parameter to specify the user context of applications to be found.

在安装过程中,您会找到 CMG STARS 的 exe 路径,并使用该值保存一个注册表项。

我讨论使用 saving an EXE's install path in the registry for updating applications here 的这种方法.


提示

如评论中所述,值得在注册表中搜索 EXE 的名称 st201110.exe 并查看 CMG STAR 应用程序的作者是否已在注册表中提供此信息您可以直接访问的 key 。


B计划

如果所有其他方法均失败,则向用户显示 FileOpenDialog 并让他们手动指定 exe 的路径。


第三方应用卸载或升级怎么办?

我提到将安装路径和 exe 名称存储在注册表(或数据库、配置文件等)中,并且在对它进行任何外部调用之前,您应该始终检查 exe 文件是否存在,例如:

if (!File.Exists(installPath + exeName))
{
//Run through the process to establish where the 3rd party application is installed
}

关于c# - 如何找到 EXE 的安装位置 - 正确的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com