我想检查某些微软组件是否像wmencoder,directx或wmplayer 安装与否。如果已安装,我还可以获取其版本号吗?
我该怎么做?
提前致谢。
答案 0 :(得分:3)
我使用下面的代码确定是否安装了其他应用程序,但是您需要知道应用程序安装在注册表中的“唯一”产品代码(来自Visual Studio中的安装项目)。
包含
using System.Diagnostics;
using Microsoft.Win32;
用法:
// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F03A-0000-0000-C000-000000000046} << This is outlook 2003
String retval = "";
// Look to see if Outlook 2003 is installed and if it is...
if ((checkComServerExists("{0006F03A-0000-0000-C000-000000000046}", out retval)))
{
// Update boolean flag if we get this far so we don't have to check again
Console.WriteLine("Office CSLID exists - Version: " + retval);
}
功能:
// Checks to see if the given CLSID is registerd and exists on the system
private static Boolean checkComServerExists(String CLSID, out String retval)
{
RegistryKey myRegKey = Registry.LocalMachine;
Object val;
try
{
// get the pathname to the COM server DLL/EXE if the key exists
myRegKey = myRegKey.OpenSubKey("SOFTWARE\\Classes\\CLSID\\" + CLSID + "\\LocalServer32");
val = myRegKey.GetValue(null); // the null gets default
}
catch
{
retval = "CLSID not registered";
return false;
}
FileVersionInfo myFileVersionInfo = null;
try
{
// parse out the version number embedded in the resource
// in the DLL
myFileVersionInfo = FileVersionInfo.GetVersionInfo(val.ToString());
}
catch
{
retval = String.Format("DLL {0} not found", val.ToString());
return false;
}
retval = myFileVersionInfo.FileVersion;
return true;
}
答案 1 :(得分:0)
我的第一个想法是WMI。类Win32_SoftwareElement(在MSDN上)
但可能需要一些工作来获得正确的类和查询。从WMI CIM Studio的WMI工具开始。
使用PowerShell,例如:
gwmi win32_softwareelement -filter "name like '%play%'" | ft
将允许找到正确的ID。 (警告:这非常慢。)
MS Installer(MSI)API可能更快。
答案 2 :(得分:0)
我使用RegShot确定可用于检查软件是否已安装的注册表设置..
答案 3 :(得分:0)
Here is also a small code snippet,其中包括Type.GetTypeFromProgID
和注册表访问权限。