检查是否存在微软组件

时间:2009-02-21 07:22:03

标签: c#

我想检查某些微软组件是否像wmencoder,directx或wmplayer 安装与否。如果已安装,我还可以获取其版本号吗?

我该怎么做?

提前致谢。

4 个答案:

答案 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和注册表访问权限。