Windowsのレジストリを調べていると、HKEY_CLASSES_ROOT(HKCR)と HKEY_LOCAL_MACHINE\SOFTWARE\Classes(HKLM\SOFTWARE\Classes)という、よく似た2つのキーに出会います。
「どちらを使えばいいの?」「中身は同じじゃないの?」と混乱する方も多いはずです。
この記事では HKLM\SOFTWARE\Classes が何を格納しているのか、HKCR とどう違うのか、主なサブキーの種類まで体系的に解説します。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ とは
HKEY_LOCAL_MACHINE\SOFTWARE\Classes(以下 HKLM\SOFTWARE\Classes)は、そのコンピューターを使うすべてのユーザーに共通するクラス登録情報を格納するレジストリキーです。
格納されている情報は、大きく2種類に分けられます。
- ファイル拡張子の関連付け情報:
.txtや.jpgなどの拡張子を、どのアプリで開くかを定義した設定 - COM機能をサポートするためのアプリケーション情報:プログラム識別子(ProgID)、クラスID(CLSID)、インターフェースID、DCOMやActiveXコントロールの設定など(Microsoft Learn「HKEY_LOCAL_MACHINE\SOFTWARE\Classes」)
アプリをインストールすると、インストーラーはこのキー配下にサブキーを自動的に作成し、「この拡張子はこのアプリで開く」「このCOMオブジェクトのクラスIDはこれ」という情報をシステム全体の既定の設定として登録します。
HKCR との関係:合成ビューの実体
HKEY_CLASSES_ROOT(HKCR)は、レジストリエディタ(regedit.exe)の最上位に見えるルートキーですが、実は独立したデータを持つキーではありません。
Windowsが次の2つのキーの情報を動的に合成して見せている仮想的なビューです(Microsoft Learn「HKEY_CLASSES_ROOT キー」)。
| 合成元キー | 役割 |
|---|---|
HKLM\SOFTWARE\Classes | 全ユーザー共通の既定設定(システムワイド) |
HKCU\Software\Classes | 現在のユーザー固有の設定(ユーザーごと) |
同じキーが両方に存在する場合は、ユーザー側(HKCU)の設定が優先されます。
例えば「.txt ファイルはメモ帳で開く」というシステム既定があっても、ユーザーが自分で「VSCodeで開く」と変更すれば、そのユーザーだけ別のアプリが起動します。
この仕組みを図で整理すると次のようになります。
HKCU\Software\Classes ←ユーザーが変更した設定(優先)
+
HKLM\SOFTWARE\Classes ←インストーラーが書いた既定設定
↓
HKCR として合成表示(レジストリエディタ上の見た目)
HKCRへの書き込みはどこに保存される?
HKCR に直接書き込みを行った場合、システムは自動的に書き込み先を振り分けます(Microsoft Learn「HKEY_CLASSES_ROOT キー」)。
| 状況 | 実際の書き込み先 |
|---|---|
| 書き込み対象キーが HKCU に存在しない | HKLM\SOFTWARE\Classes |
| 書き込み対象キーが HKCU にすでに存在する | HKCU\Software\Classes |
この振り分けは自動的に行われるため、「HKCR に書いたのに HKLM のほうが更新された」という挙動が起きます。
明示的に全ユーザー共通の既定を変更したい場合は、HKLM\SOFTWARE\Classes を直接指定することが推奨されています。
主なサブキーの種類
HKLM\SOFTWARE\Classes の直下には、大きく3つのカテゴリのサブキーが格納されています。
① 拡張子キー(.txt・.jpg など)
先頭がドット(.)で始まるキーで、ファイル拡張子と ProgID の紐付けを定義します。
「この拡張子のファイルは、どのProgIDが担当するか」を指定するエントリです。
HKLM\SOFTWARE\Classes\.txt
└─ (既定) = "txtfile"
└─ Content Type = "text/plain"
└─ PerceivedType = "text"
(既定) の値に設定されている文字列(上記例では txtfile)が、次に説明する ProgID キーの名前に対応します。
② ProgID キー(txtfile・Word.Document など)
ProgID(Programmatic Identifier:プログラム識別子)は、拡張子に対応するアプリケーションの動作を定義するキーです。
「このファイルをダブルクリックしたときに何を実行するか」「アイコンはどれを使うか」などを指定します(Microsoft Learn「バージョンに依存しない ProgID キー」)。
HKLM\SOFTWARE\Classes\txtfile
└─ shell\
└─ open\
└─ command\
└─ (既定) = "%SystemRoot%\system32\NOTEPAD.EXE %1"
└─ DefaultIcon\
└─ (既定) = "%SystemRoot%\system32\imageres.dll,-102"
ファイルをダブルクリックしたとき、Windowsエクスプローラーは次の順番で情報を辿ります。
- クリックされたファイルの拡張子キー(例:
.txt)を参照して ProgID を取得 - 取得した ProgID キー(例:
txtfile)のshell\open\commandを参照して実行ファイルのパスを取得 - 実行ファイルを起動してファイルを開く
ProgID はバージョン管理にも対応しており、CurVer というサブキーを使って「最新バージョンの ProgID はどれか」を示す仕組みも存在します。
例えば Microsoft Officeがインストールされている環境では、Word.Document というバージョン非依存の ProgID の CurVer に Word.Document.16 のような現行バージョンの ProgID が設定されています。
③ COM関連キー(CLSID・AppID・Interface・TypeLib)
COMオブジェクト(Component Object Model)に関連する情報を格納するキー群です。
これらのキーは主に開発者向けの情報ですが、仕組みを知っておくとトラブル対応に役立ちます。
| キー名 | 内容 |
|---|---|
| CLSID | COMクラスオブジェクトを識別するグローバル一意識別子(128ビット)の登録情報。{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} の形式でサブキーが並ぶ(Microsoft Learn「CLSID キー」) |
| AppID | DCOMアプリケーションの設定(実行ユーザー、リモート接続設定など) |
| Interface | COMインターフェースIDとその名称・プロキシDLLの対応 |
| TypeLib | タイプライブラリ(COMが扱えるデータ型・インターフェースの定義ファイル)の場所と情報 |
CLSIDキーの具体例を示すと次のとおりです。InprocServer32 サブキーには、そのCOMクラスを実装するDLLのパスが格納されており、Windowsはこれを参照してDLLを読み込みます。
HKLM\SOFTWARE\Classes\CLSID\{0069c1ec-3242-4e30-b7c2-0f5cc3a19453}
└─ InprocServer32\
└─ (既定) = "C:\Windows\System32\example.dll"
└─ ThreadingModel = "Apartment"
└─ ProgID\
└─ (既定) = "Example.Component"
サービスプロセスでの注意点
ログオン中のユーザーとは異なるセキュリティコンテキストで動作するプロセス(Windowsサービスなど)は、HKEY_CLASSES_ROOT を直接使用すべきではないとされています。
HKCRはインタラクティブユーザーのセッション情報を前提として合成されるため、サービスプロセスから参照すると意図しないユーザー設定が混入する可能性があるためです。
代わりに次の方法が推奨されます(Microsoft Learn「HKEY_CLASSES_ROOT キー」)。
- 全ユーザー共通の既定設定を参照したい場合:
HKLM\SOFTWARE\Classesを明示的に開く - 特定ユーザーの設定と既定設定をマージした状態で参照したい場合:
RegOpenUserClassesRoot関数を使用する
HKCU\Software\Classes との使い分け
HKLM\SOFTWARE\Classes と HKCU\Software\Classes は同じ構造を持ちますが、影響するスコープが異なります。
| 項目 | HKLM\SOFTWARE\Classes | HKCU\Software\Classes |
|---|---|---|
| 影響範囲 | コンピューター上の全ユーザー | 現在のログオンユーザーのみ |
| 書き込みに必要な権限 | 管理者権限が必要 | 一般ユーザー権限で書き込み可能 |
| 主な用途 | インストーラーによるシステムワイドな登録 | ユーザー個別のカスタマイズ |
| 優先度(競合時) | 低い(HKCUに同じキーがあればHKCUが優先) | 高い |
Windows 10以降は、ファイルの関連付けをレジストリの直接変更で書き換えることが制限されています。
これは悪意あるアプリが黙ってブラウザや開くアプリを書き換えるのを防ぐための仕様変更で、プログラムに対してファイルの関連付けを行う場合は HKLM\SOFTWARE\RegisteredApplications を使った正規の登録手順が必要です。
まとめ
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ は、ファイル拡張子の関連付けとCOMオブジェクトの登録情報をコンピューター全体の既定値として格納するキーです。HKEY_CLASSES_ROOT はこのキーとユーザー固有の HKCU\Software\Classes を合成して表示する仮想ビューであり、同じキーが両方に存在する場合はユーザー側(HKCU)の設定が優先されます。
直接編集が必要な場合は、全ユーザー共通の設定を変えたいなら HKLM\SOFTWARE\Classes を、自分だけの設定を変えたいなら HKCU\Software\Classes を対象にするのが基本原則です。
どちらの場合も、変更前に必ずバックアップを取ることを忘れずに。
参考情報源:


コメント