Список всех доступных ProgId

Я хотел бы получить список, используя C#, всех прог на моем компьютере. Я знаю, что могу сканировать реестр, что-то вроде этого:

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. Что делать, если мне также нужны вне процесса?

заранее спасибо

2 ответа

Решение

Это даст вам все зарегистрированные ProgID, локальные или удаленные (как вне процесса, конечно, не на другой машине). Кроме того, код просто перечисляет раздел реестра, он уже прост.

Если вопрос "есть ли определенный API для этого", MS не предоставит ни одного. Вполне возможно, что существует какая-то сторонняя реализация, которая в основном делает то же самое, что и этот код.

Это слишком просто. Перечисление ProgId в ключе CLSID является опцией, но не обязательным. Примерами ProgID на моем компьютере, у которых его нет, являются портфель, CABFolder, FaxCommon.1, JobObject, NetworkConnections, Shell.AutoPlay и так далее.

Вы должны начать с итерации корня и искать ключи, у которых есть подраздел с именем CLSID. Что дает вам руководство clsid. Тогда открой HKCR\CLSID\{guid} и искать путь.

Вы также должны следить за ProgID, которые зарегистрированы только для текущего пользователя. Сделайте это с помощью первой итерации HKCU\Software\Classes и отфильтровывать любые дубликаты, найденные вами при итерациях HKCR.

Остерегайтесь, что все это довольно рискованно, есть много мусора, с которым вы столкнетесь из-за плохо разработанных регистраций COM-компонентов. Используйте try/catch, чтобы поймать мусор.

Другие вопросы по тегам