我使用此功能查找任何已安装的应用。
但参数“InstallLocation”根本不起作用。
有任何线索吗?
谢谢!
void FindApplication(string appName)
{
StringBuilder sbProductCode = new StringBuilder(39);
int iIdx = 0;
while (0 == MsiEnumProducts(iIdx++, sbProductCode))
{
Int32 productNameLen = 512;
StringBuilder sbProductName = new StringBuilder(productNameLen);
MsiGetProductInfo(sbProductCode.ToString(), "ProductName", sbProductName, ref productNameLen);
if (sbProductName.ToString().Contains(appName))
{
Int32 installDirLen = 2048;
StringBuilder sbInstallDir = new StringBuilder(installDirLen);
MsiGetProductInfo(sbProductCode.ToString(),"InstallLocation", sbInstallDir, ref installDirLen);
string result = string.Format("ProductName {0}: {1}", sbProductName, sbInstallDir);
}
}
}
答案 0 :(得分:3)
我访问了以下链接,但它们似乎没有过时:
我看到的唯一可以使用的键是:
我应该指出,应该使用MsiGetProductInfoEx
(第二个链接)来收集其他用户添加的已发布/已安装产品的信息;并需要行政许可。
答案 1 :(得分:0)
我找到了其他解决方案,但效果很好。
string FindPathByInstalledAppEXEName(string appEXEName)
{
string path = string.Empty;
try
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Installer\Assemblies");
string regfilepath = string.Empty;
if (key != null) // Make sure there are Assemblies
{
foreach (string Keyname in key.GetSubKeyNames())
{
if (Keyname.IndexOf(appEXEName) > 0)
{
regfilepath = Keyname;
break;
}
}
}
if (!string.IsNullOrEmpty(regfilepath))
{
string fullpath = "";
for (int a = 0; a < regfilepath.Length; a++)
{
if (regfilepath.IndexOf("|", a, 1) > 0)
fullpath += "\\";
else
fullpath += regfilepath.Substring(a, 1);
}
path = fullpath.Substring(0, fullpath.LastIndexOf("\\") + 1);
}
}
catch // (Exception ex)
{
}
return path;
}