2012-10-04 56 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來捕捉垃圾。