2

我想使用 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();
}

代码来自这个博客。

有谁知道是否有更简单的方法?此外,据我了解这是如何工作的,上面的代码可能只会给我进程内的 com. 如果我也需要进程外的 progid 怎么办?

提前致谢

4

2 回答 2

3

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

您必须从迭代根开始并查找具有名为 CLSID 的子键的键。这为您提供了 clsid 指导。然后打开HKCR\CLSID\{guid}并寻找路径。

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

请注意,这一切都是相当冒险的,您会因为设计不良的 COM 组件注册而遇到大量垃圾。使用 try/catch 捕捉垃圾。

于 2012-10-04T10:08:36.633 回答
1

这将为您提供所有已注册的 ProgID,本地或远程(当然,作为进程外,而不是另一台机器)。此外,代码只是枚举注册表项,已经很简单了。

如果问题是“是否有特定的 API”,则 MS 没有提供。很可能有一些第三方实现与这段代码基本上做同样的事情。

于 2012-10-04T09:48:06.137 回答