列出所有可用的ProgId

时间:2012-10-04 09:03:32

标签: c# com registry progid

我想在我的计算机上使用C#获取所有progis的列表。我知道我可以扫描注册表,如下所示:

var regClis = Registry.ClassesRoot.OpenSubKey("CLSID");
var progs = new List<string>();

foreach (var clsid in regClis.GetSubKeyNames()) {
    var regClsidKey = regClis.OpenSubKey(clsid);
    var ProgID = regClsidKey.OpenSubKey("ProgID");
    var regPath = regClsidKey.OpenSubKey("InprocServer32");

    if (regPath == null)
        regPath = regClsidKey.OpenSubKey("LocalServer32");

    if (regPath != null && ProgID != null) {
        var pid = ProgID.GetValue("");
        var filePath = regPath.GetValue("");
        progs.Add(pid + " -> " + filePath);
        regPath.Close();
    }

    regClsidKey.Close();
}

代码来自this blog.

有没有人知道是否有更简单的方法?此外,据我所知,这是如何工作的,上面的代码可能只会给我进程中的com。如果我还需要进程流程怎么办?

提前致谢

2 个答案:

答案 0 :(得分:3)

太简单了。在CLSID键中列出ProgId是一个选项,它不是必需的。我的机器上没有它的ProgID示例有Briefcase,CABFolder,FaxCommon.1,JobObject,NetworkConnections,Shell.AutoPlay等。

您必须从迭代根开始,并查找具有名为CLSID的子项的键。这给了你clidid guid。然后打开HKCR\CLSID\{guid}并查找路径。

您还必须注意仅为当前用户注册的ProgID。通过首先迭代HKCU\Software\Classes并过滤从迭代HKCR中找到的任何重复项来实现。

请注意,这一切都相当危险,因为设计不良的COM组件注册会产生大量垃圾。使用try / catch来抓住垃圾。

答案 1 :(得分:1)

这将为您提供所有已注册的ProgID,本地或远程(当然,不包括其他机器)。此外,代码只是枚举注册表项,它已经很简单了。

如果问题是&#39;是否有针对此问题的特定API,则MS不提供任何API。很可能有一些第三方实现基本上与此代码完全相同。