【问题标题】:Locating the installation location of a 3rd party application in an .msi project in MSVS在 MSVS 的 .msi 项目中定位第 3 方应用程序的安装位置
【发布时间】:2009-05-22 00:45:32
【问题描述】:
上下文:我有一些插件(实际上只是具有不同扩展名的 DLL)需要安装在第 3 方应用程序的子文件夹中。通常只需将它们复制到所述文件夹就足够了,但有时还需要安装其他库。我想让这个过程对用户来说不太容易出错,所以我研究了使用 Visual Studio 中的安装程序项目来创建一个 .msi,但我无法正确配置安装位置。
似乎它假定安装程序是为一个完整的应用程序而设计的,并且默认为 C:\Program Files\MyApp\ 等位置,但我真正需要的是 C:\Program Files\\Plugins。我不想假设用户在任何特定位置安装了第 3 方应用程序,所以我想要的是一种定位其他应用程序安装位置的方法。我已经搜索了微软的文档并自己进行了一些实验,但没有任何成功。
假设这是可能的,有人知道如何完成我想要的吗?
【问题讨论】:
标签:
windows
dll
installation
visual-c++
【解决方案1】:
大多数应用程序会将其安装位置写入注册表中的某个位置。我们读取以下注册表项下的值以查找 Microsoft Word 安装位置。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe]
很遗憾,没有标准方法可以检索特定应用程序的安装位置。您必须搜索注册表才能找到所需的内容。
【解决方案2】:
如果您的应用程序使用 Windows 安装程序,您可以尝试这种方法 (C#):
Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Installer msi = (Installer)Activator.CreateInstance(type);
foreach (string productcode in msi.Products)
{
string productname = msi.get_ProductInfo(productcode, "InstalledProductName");
if (productname.Contains("<YOUR PRODUCT NAME HERE>"))
{
string installdir = msi.get_ProductInfo(productcode, "InstallLocation");
Console.WriteLine("{0}: {1} @({2})", productcode, productname, installdir);
}
}