2

I would like to obtain a list, using C#, of all progis's on my computer. I know I can scan the registry, something like this:

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();
}

The code is from this blog.

Does anyone know if there's a simpler way? Also, as far as I understand how this works, the code above would probaly only give me in-process com. What if I need out of process progids as well?

Thanks in advance

4

2 に答える 2

3

単純すぎます。CLSIDキーにProgIdをリストすることはオプションであり、必須ではありません。それを持たない私のマシン上のProgIDの例は、Briefcase、CABFolder、FaxCommon.1、JobObject、NetworkConnections、Shell.AutoPlayなどです。

ルートの反復から始めて、CLSIDという名前のサブキーを持つキーを探す必要があります。これにより、clsidGUIDが得られます。次に、開い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 に答える