potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

HKEY_CLASSES_ROOTに登録されたCLSIDのサブキー一覧

かなり古いPCでHKEY_CLASSES_ROOTに登録されたCLSIDのサブキーの一覧です。出現回数が5回未満のサブキーは除外しています。

回数 サブキー
5000回以上 InprocServer32
5000回未満100回以上 ProgID、VersionIndependentProgID、TypeLib、Version、Implemented Categories、Programmable、LocalServer32、DefaultIcon、MiscStatus、ToolboxBitmap32、ShellFolder、InprocHandler32、Elevation、Control
100回未満10回以上 Instance、Containers、Insertable、NotInsertable、AuxUserType、shell、shellex、DataFormats、PersistentHandler、Verb、PersistentAddinsRegistered、Conversion、TreatAs、DocObject、DefaultExtension、AutoConvertTo、SupportedProtocols、Server、VirtualServerObjects、OLEScript
10回未満5回以上 BrowseInPlace、OLE DB Provider、ExtendedErrors、OverrideFileSystemProperties

以下のソースコードでサブキーの名前と出現回数を取得して、手動で分類しています。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Win32;

class Program
{
    static void Main()
    {
        Dictionary<string, int> subKeyNames = new Dictionary<string, int>(
            StringComparer.OrdinalIgnoreCase);

        using var hkcr = RegistryKey.OpenBaseKey(
            RegistryHive.ClassesRoot, RegistryView.Registry64);
        using var clsidKey = hkcr.OpenSubKey("CLSID");
        foreach (var keyName in clsidKey.GetSubKeyNames())
        {
            using var key = clsidKey.OpenSubKey(keyName);
            foreach (var subKeyName in key.GetSubKeyNames())
            {
                if (!subKeyNames.ContainsKey(subKeyName))
                {
                    subKeyNames[subKeyName] = 1;
                }
                else
                {
                    subKeyNames[subKeyName] = subKeyNames[subKeyName] + 1;
                }
            }
        }

        foreach (var subKeyName in subKeyNames.OrderByDescending(entry => entry.Value))
        {
            Console.WriteLine(subKeyName);
        }
    }
}