首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出所有可用ProgId

列出所有可用ProgId
EN

Stack Overflow用户
提问于 2012-10-04 17:03:32
回答 2查看 3.8K关注 0票数 2

我想用C#获得我电脑上所有程序的列表。我知道我可以扫描注册表,就像这样:

代码语言:javascript
复制
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。如果我也需要进程外的progids怎么办?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 17:48:06

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

如果问题是‘有没有一个特定的API来解决这个问题’,那就不会有女士提供的API,很可能有一些第三方实现基本上和这个代码做了同样的事情。

票数 1
EN

Stack Overflow用户

发布于 2012-10-04 18:08:37

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

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

您还必须注意仅为当前用户注册的ProgID。要做到这一点,首先迭代HKCU\Software\Classes并过滤您在迭代HKCR时找到的任何重复项。

请注意,这一切都是相当危险的,在设计糟糕的COM组件注册过程中,您会遇到很多垃圾。使用try/catch来捕获垃圾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12723821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档