2012-10-04 54 views
2

我想在我的电脑上使用C#获取所有progis的列表。我知道我可以扫描注册表,这样的事情:列出所有可用ProgId

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。如果我还需要进程progid以及怎么办?

在此先感谢

+1

'LocalServer32'是用于进程外的。它不能比直接枚举更简单。 –

+0

如果你扫描使用如下代码注册表,请记住,'RegistryKey'是'IDisposable' - 你应该'Dispose'每个对象从以'OpenSubKey'的调用返回,否则会消耗大量的注册表手柄,直到垃圾当终结器线程轮到关闭它们时收集。 –

回答

1

这会给你所有注册的ProgID,本地或远程(如外的进程外,没有另外一台机器,当然)。此外,代码只是枚举注册表项,它已经很简单了。

如果问题是“是一个用于此特定API”,没有一个由MS提供。很可能有一些第三方实现基本上与此代码执行相同的操作。

3

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

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

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

当心,这是所有相当有风险的,有大量的垃圾,你会从设计不佳的COM组件注册碰上了。使用try/catch来捕捉垃圾。