プログラミングの丘

Windows レジストリ 解剖記

このページでは、Windows のレジストリの細かい部分(?)について今までに分かったことを書いています。このページは、随時更新されます。

今気付いたら、関連付けの内容がほとんどを占めていた。。

このページで生じた問題の責任は追いかねます。レジストリの操作にあまり慣れていないときは、必ずバックアップをとってからするようにしてください。また、不用意にいろいろなデータを削除すると Windows が起動しなくなる原因となります。

目次

このページでの記述方法について

レジストリの「キー」は、レジストリ エディタでは左側の項目、「値」は右側の項目にあるデータのことを指します。

レジストリのキーと値は、以下のように表記します。

key-name」はキーの名前ですが、その横の「<default-value>」は、レジストリ エディタで言えば「(標準)」となっている値の内容です(このページでは「既定の値」と呼びます)。

キーか値かは、名前の先頭に「(var)」が付いているかどうかで判断してください。例えば、「sub-key-name1」はキーですが、「(var) value-name」は値を表しています。

また、<value>の前の文字は、値の種類を表します。文字と値の種類は以下の通りです。

接頭辞 API 上の種類 種類
(なし) REG_SZ, REG_EXPAND_SZ 文字列 (% が入っていれば「拡張可能な文字列」(REG_EXPAND_SZ) )
d REG_DWORD DWORD 値 (数値)
b REG_BINARY バイナリ(binary) 値

※ このページでは文字列の値はすべて「" "」で括っています。レジストリ エディタで文字列の値を書き込むとき、「先頭と末尾」の「"」は取り除いてください(中のものはそのまま)。

なお、「任意のデータを入力する」という意味で「<data>」と、「< >」で括っていることがあります。このときも、例えば文字列を入れる際は、「< >」も含めてまるごと任意のデータに、「" "」付きで置き換えて読んでください。例として、「<default-value>」を「"MyData"」と置き換えます。

(ちなみに、「(標準)」の値は、レジストリ エディタでは文字列だけですが、レジストリを登録するファイルでこの値を「DWORD 値」や「バイナリ値」にすることは可能です。)

HKEY_CLASSES_ROOT 内の .ext キー

このキーは、「ファイルの関連付け」を行っています。その内容は以下の通りです。

<command-line>」には、実行するプログラム名と、「%1」なるものを設定します。例えば、メモ帳を開くコマンドの場合は「"C:\WINDOWS\NOTEPAD.EXE %1"」のようになります。この %1 は、実際に開くファイル名が入ります。

other-command-name」には、「open」コマンドに対して、それ以外のコマンドを作ります。この名前は何でもいいですが、他のものとかぶらないようにします。その横の「<command-name>」は、右クリックしたときに表示するコマンドの名前を指定します。「<command-line>」は上記と同様です。(なお、open は必須ではありません。)

ところが、多くの拡張子は、「<description>」に適当な名前をぶち込み、その名前を HKEY_CLASSES_ROOT の中にキーとして登録しています。形式としてまとめると以下の通りです。

(「extfile」の中の情報は、上記と同じなので省略します。)
この形式では、「.ext」の既定の値を「extfile」とし、さらに「extfile」というキーを作っています。こうすることにより、データがすっきるする上、「.ext2」のように、他の拡張子を持つファイルを同じ種類のファイルに設定することができます。(extfileは、「ファイルの種類」のうちの 1 つとなります。)

また、「.ext」の中に書き込めるデータとして、以下のものがあります。

Content Type
ファイルの MIME タイプを指定します。例えば通常のテキストなら「text/plain」、HTML なら「text/html」などです。なお、Internet Explorer はこの値を利用しません
OpenWithList
ファイルを右クリックして出る「プログラムを指定して開く」の一覧や、「ファイルを開くアプリケーションの選択」ダイアログボックスに入るアプリケーションを登録します。ここと下記の「HKCU\Software\...\FileExts キー」の登録内容を合わせたリストが実際に表示されます。
ここに登録するには、「Applications キー」への登録も必要です。
<Application> はアプリケーション名またはプログラムのファイル名を指定します。この中に、開く方法を指定するための「shell」キーを登録することも可能で、登録しない場合は Applications キーの登録内容を使用します。
PerceivedType
[Windows XP 以降] この拡張子のファイルを、登録されている種類に関連付けます。これにより、同じ種類に指定したファイルタイプは同じコマンドを持つことができます。詳しくは「SystemFileAssociations キー」をご覧ください。
ShellNew
何もないところを右クリックすると出る「新規作成」に追加します。この中に 4 つの値がありますが、この中から 1 つだけ選びます

名前説明
NullFile 空のファイル (0 バイト) を作成します。値の内容は無視されます。
FileName 値の内容で指定されたファイル名のコピーを作成します。パスが指定されていない場合、「C:\WINDOWS\ShellNew」や「C:\WINDOWS\Templates」(Windows NT/2000/XP 以降の場合は「C:\Documents and Settings\user\Templates」)からファイルを探します。なお、見つからない場合は空のファイルが作成されます。
Command 値の内容で指定されたコマンドを実行します。コマンドの中に、「%1」(%2 も?)を入れることができ、これは、新しく作成するファイル名を指しています。
Data [Windows XP 以降] 指定したバイナリデータを持つファイルを作成します。値の内容がそのままファイルデータとなります。

[Windows 95/98/Me] ShellNew を登録しても反映されない時は、ShellNew Manager の修復機能をご利用ください。

さらに、「extfile」以下にはさまざまな情報を指定することができます。その詳細は以下のセクションを参照してください。

それ以外の通常のキー

キー名が「.」(ドット)から始まらない通常のキーは、上述のファイルの関連付けに用いるほか、COM におけるクラスの定義なども行います。これらの名前を、ProgID(Programmatic Identifier)と呼びます。

形式としてまとめると、以下の通りです。(対象となるキーを「class-name」としてます)

※ 以下のデータは、一部「.ext」の中にも書き込めます。

<description>
このクラス(またはファイルの種類)を端的に表す内容を記述します。例えば、class-name が「exefile」なら「アプリケーション」といった具合です。
CurVer
このキーの既定値は、COM でクラスのバージョン管理を行うのに使用されます。例えば、(class-name が)「Word.Document」というキーには CurVer があり、もし Microsoft Office がインストールされていると、既定値が「Word.Document.7」や「Word.Document.8」となっていて、COM は CurVer に指定されているキーを参照します。
CLSID
このキーの既定値は、HKEY_CLASSES_ROOT 以下の特殊なキーCLSID」に定義されている CLSID を指定します。このキーが指定されていると、COM オブジェクトと ProgID が関連付けられ、ProgID から CLSID を取得することができます。
ちなみに、ファイルの種類として class-name を定義している場合、CLSID は大抵シェル拡張を使用してファイルを処理しているか、OLE として編集や挿入ができるファイル形式で用いられることが多くなっています。(これらでは CLSID が必要となってきます。)
FriendlyTypeName
この値は、上述の <description>リソースから取得する場合に使用します。これを行うことで、ファイルの種類などの説明を、言語に応じて表示させることができます。
この値の指定方法は、「@<file-name>,<value>」とし、<file-name> にはリソースを所有するファイル名(EXE、DLL など)、<value> には文字列リソースの ID を絶対値に持つ負の値(ID が 101 なら -101)を指定します。(例: "@%SystemRoot%\system32\notepad.exe,-469" ただしこの文字列は REG_EXPAND_SZ (「展開可能な文字列」)で指定)
InfoTip
この値は、エクスプローラのステータスバー上などでファイルの説明表示に使用されます。指定する値は、説明となる文字列を直接入力するか、FriendlyTypeName と同様の値も指定できます。
さらに「prop:」で始まる値を指定した場合は、セミコロンで区切られた説明の形式を指定します。セミコロンで区切る項目は、選択されたファイル固有の情報の名称で、「Size」「Type」や「DocTitle」(OLE ファイル)、「FileDescription」(実行可能ファイル)などです。(例: "prop:Type;DocAuthor;DocTitle;DocSubject;DocComments;Write;Size")
QuickTip
(調査中、InfoTip の簡略版?)
TileInfo
[Windows XP 以降] この値は、エクスプローラの「並べて表示」でのファイルの説明表示に使用されます。指定する値は InfoTip と同じです。
ShellEx
ドラッグ ドロップや、アイコン、右クリックメニューなどに特殊な動作を入れる時に使います(プラグインのようなもの)。これを指定すると DLL を呼び出すことになるので、かなり複雑です。(詳しい説明は省略)
EditFlags
設定の「ファイルの種類」/「ファイル タイプ」(以下「ファイルの設定」)で表示する時や、ファイルを開く時の動作などにいろいろな効果をつけます。DWORD 値で、以下の数値を足して組み合わせて指定します。(FILETYPEATTRIBUTEFLAGS の値)

名前説明
FTA_Exclude = 0x00000001 (1) ファイルの設定に拡張子を表示させないようにします。
FTA_Show = 0x00000002 (2) 拡張子が割り当てられていなくてもファイルの設定に表示させるようにします。
FTA_HasExtension = 0x00000004 (4) (調査中、効果なし?)
FTA_NoEdit = 0x00000008 (8) ファイルの設定で「詳細設定」をできなくします。
FTA_NoRemove = 0x00000010 (16) ファイルの設定で削除できなくします。(動作しない?)
FTA_NoNewVerb = 0x00000020 (32) ファイルの設定で新しい動作を追加できないようにします。(動作しない?)
FTA_NoEditVerb = 0x00000040 (64) ファイルの設定で「open」や「print」などの動作を編集できないようにします。
FTA_NoRemoveVerb = 0x00000080 (128) ファイルの設定で「open」や「print」などの動作を削除できないようにします。
FTA_NoEditVerb = 0x00000100 (256) ファイルの設定で、ファイルの種類を表す文字列を編集できないようにします。
FTA_NoEditIcon = 0x00000200 (512) ファイルの設定で、アイコンを編集できないようにします。
FTA_NoEditDflt = 0x00000400 (1024) ファイルの設定で「標準」(既定の動作)を変更できないようにします。(動作しない?)
FTA_NoEditVerbCmd = 0x00000800 (2048) ファイルの設定で「アプリケーション」の欄を変更できないようにします。(動作しない?)
FTA_NoEditVerbExe = 0x00001000 (4096) ファイルの設定で動作を追加/削除できないようにします。(動作しない?)
FTA_NoEditDDE = 0x00002000 (8192) ファイルの設定で、DDE コマンドを変更できないようにします。(動作しない?)
FTA_NoEditMIME = 0x00008000 (32768) ファイルの設定で、Content-type (MIME タイプ)を変更できないようにします。(動作しない?)
FTA_OpenIsSafe = 0x00010000 (65536) ダウンロードするファイルが「安全に」開けると示します。
FTA_AlwaysUnsafe = 0x00020000 (131072) (調査中、FTA_OpenIsSafe の逆と思われ)
FTA_AlwaysShowExt = 0x00040000 (262144) 常に拡張子を表示させるようにします。(動作しない?、下の AlwaysShowExt を使ったほうがいいと思う)
FTA_NoRecentDocs = 0x00100000 (1048576) ファイルを開いても「最近使ったファイル」に追加されないようにします。

IsShortcut
この値を設定すると、アイコンにショートカットを表す矢印が追加されます。なお、値の内容は無視されます。
AlwaysShowExt
この値を設定すると、「登録されているファイルの拡張子は表示しない」が指定されていても、常に拡張子を表示します。なお、値の内容は無視されます。
NeverShowExt
AlwaysShowExt と反対で、「登録されているファイルの拡張子は表示しない」が指定されていなくても、常に拡張子を表示しません。なお、値の内容は無視されます。
NoOpen
ファイルを「アプリケーションから開く」で開こうとした時に、値の内容で指定されるメッセージを表示し、注意を促します。値の内容が指定されていない場合、「システムに悪影響を及ぼす」などのメッセージとなります。
URL Protocol
このファイルの種類が URL プロトコルとして使用できることを示します。これは、アドレスバーに「class-name:」と入力し、コロンの後に何か文字を入れると、動作の「open」が実行されます (%1 はコロンの前も含みます)。
DefaultIcon
ファイルを表示する際のアイコンを指定します。このキーの既定の値に、「アイコンのファイル名」と、コンマ(「,」)で区切ってアイコンのインデックスを指定します。アイコンのファイル名は EXE ファイル、DLL ファイル、ICO ファイルなどで、インデックスは「何番目のアイコンか」を指定します。インデックスを負の数値(マイナスの数値)で指定すると、この数値の絶対値はアイコンのリソース ID を表すようになります。

なお、もともとアイコンを持つ exe ファイルや ico ファイル、ShellEx で IconHandler を使用している場合は、この値は「%1」となります。
FriendlyCache (shell 内)
Applications」キーの中で効果を発揮します(下記参照)。「ファイルを開くアプリケーションの選択」で表示する時のプログラムの説明を設定します。
Extended (shell 内)
[たぶん Windows 2000/XP 以降] 右クリックで表示する時、Shift キーを押しているときだけ、このコマンドを表示させるようにします。例としては、Windows 2000 では、Shift キーを押したままプログラムを右クリックすると、「別のユーザーとして実行」というコマンドが現れます。
ddeexec (command 内)
ファイルを開くなどの動作を DDE(Dynamic Data Exchange) 通信で行います。これは、同じアプリケーションを実行している時に、新たにもう 1 つ起動することなく、ファイルを開く動作を行うことができます。(通信といっても、インターネットなどの通信ではありません。)
ddeexec の中に、「application」や「topic」のキーを置くことがあります。

SystemFileAssociations キー

このキーは、Windows XP 以降で使用できます。

このキーでは、拡張子の垣根を越えてファイルの種類を設定します。通常の登録方法とは違い、拡張子それぞれに割り当てられたファイルの種類に追加して登録するような形が行えます。この内容は以下の通りです。

SystemFileAssociations の中にはファイルの種類(に似たもの)を登録します。<type> が実際のタイプの名称になり、あらかじめ登録されているものとしては「text」や「system」などがあります。<type> の中身は上述の extfile と同じものを記述することができます。例えば、shell キーや DefaultIcon キー、NoOpen などを含めることができます。

ここに登録を行うと、上述の「PerceivedType」で指定したファイルすべてにこれらの関連付け設定が反映されます。ただし、元のファイルに既に「shell」キーの同じ名称のデータが存在する場合や、DefaultIcon の設定が行われている場合などは、そちらが優先されます。

なお、定義済みの名称(「text」、「system」、「image」など)以外はうまく反映されないようです。また、<type> の先頭をピリオド「.」にすると、PerceivedType に登録していなくても、拡張子が一致するものがここの内容を適用されるようです。

HKEY_CLASSES_ROOT 内の特殊なキー

*
このキーは、ワイルドカードで「すべての拡張子」という意味で、ここの下の内容はフォルダ以外すべてに適用されます。例えば、この中には「アプリケーションから開く」で、登録されているプログラムと「プログラムの選択」というメニューを表示させるためのデータ(shellex 内)が入っています。
Unknown
(Unknownは「未知の」という意味)
このキーの内容は、.extが存在しないすべての拡張子に適用されます。例えば、この中には「アプリケーションから開く」コマンド(shell 内)が入っています。
AllFilesystemObjects
このキーの内容は、ファイルシステムに相当するもの(フォルダ、ファイルのことで、ドライブは入らない)に適用されます。例えば、この中には「送る」メニューを表示させるためのデータ(ShellEx 内)が入っています。
CLSID
(CLSIDClass IDの略)
このキーの中には、膨大な数のGUIDが登録されています。この中のデータは、COMで使用され、それぞれのデータに基づいて DLL が呼び出されます。
Interface
このキーの中には、CLSIDと同じように膨大な数の GUID(IID) が登録されています。
TypeLib
このキーの中には、CLSIDと同じようにいくつかの GUID が登録されています。こちらは、アプリケーションや DLL などのライブラリを表す GUID です。
AppID
このキーの中は、TypeLibと同じようですが、GUID 以外にアプリケーションの名前自身も登録されています。これらは、OLE で使われます。
Applications
このキーの中には、アプリケーションが登録されています。これらは、「ファイルを開くアプリケーションの選択」ダイアログで使われます。形式は、プログラムのファイル名のキーを作り、その中に値「NoOpenWith」(一覧に表示させなくする)や、「shell」キーを作り、この中には「FriendlyCache」(上記参照)を設定したり、「open」「command」で、ファイルを開く時の実行方法を指定したりします。
Licenses
このキーの中は GUID が登録されていて({} は無い)、これらの GUID と同じ物を持つコントロール(OCX)を利用する際に必要な「ライセンス キー」が登録されています。
MIME
このキーの中は、文字セット、コードページ、Content Typeが登録されています。特に Content Type は、拡張子が関連付けられていて、ブラウザで使用されます。(実際はここを利用していない?)
Protocols
このキーの中は、http や file などのプロトコルが登録されています。これらを利用する時は、アドレスに「http:」のように付けます。「//」が必要かはそれぞれのプロトコルによります。
Drive
このキーは、「ドライブ」(ローカル ディスク)を指すファイルの種類です。この中の shell に実行するアプリケーションを登録すると、ドライブを右クリックしたときのメニューに追加されます。
Folder
このキーは、「フォルダ」を指すファイルの種類です。Drive キーと同じように、普通のファイルの種類と同じようにこのキーを扱えます。
Directory
このキーは、説明が「ファイル フォルダ」となっているファイルの種類です。実際このキーは、Drive と Folder の要素を兼ね備えています。つまり、ここにいろいろと登録すると、その内容はドライブとフォルダの両方に適用されます。

HKEY_CURRENT_USER 内の Software\Microsoft\Windows\CurrentVersion\Explorer\AutoComplete キー

このキーは、AutoComplete (オートコンプリート) に関する情報が収められます。

Append Completion
この値を「yes」にすると、オートコンプリートで一覧を表示する際、リストの一番上に来る文字列を自動的に補完します。反転状態で補完するため、そのまま入力を続けるとその部分は上書きされます。

HKEY_CURRENT_USER 内の Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts キー

このキーは、「アプリケーションから開く」に関するデータを扱っています。

OpenWithList
このキーには、「ファイルを開くアプリケーションの選択」でユーザーが参照したアプリケーションなどが登録されていきます。
MRUList
a、b、c などに登録されているプログラムの並び替え順序を表します。「bca」なら b、c、a の順に表示されます。
a, b, c, ...
一覧に表示するプログラムの名前(ファイル名)を指定します。

用語

レジストリ エディタ (Registry Editor)
レジストリ エディタは、Windows に付属している、レジストリを直接編集するためのアプリケーションです。ファイル名は「Regedit.exe」で、Windows フォルダ(%SystemRoot%)に入っています。また、Windows NT 系には「Regedt32.exe」もあり、こちらはセキュリティ権限も考慮されたバージョンとなっています。

GUID
Globally Unique Identifier の略で、16 バイト(16 進数 32 桁)から成るいわゆる「識別番号」です。GUID には IID と CLSID などがあり、IID は COM インターフェイスを、CLSID は COM クラスを示す GUID です。また、文字列の形式は {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (x は 16 進数、3 つ目のかたまりの 4 桁のみ小文字を使い、ほかは大文字を使う表記が多い)です。なお、GUID は重複することがないと考えられています(パターンが 1,208,925,819,614,629,174,706,176 = 約 1 ジョ(10の24乗) = 約 12,089 垓 = 約 120,892,581 京 = 約 1,208,925,819,614 兆通りなので)。

COM
Component Object Model の略で、オートメーションや OLE など、クラスやインターフェイスを利用するための足がかりとなるコンポーネントのまとまり(総称)です。CLSID(クラスの GUID)を通して、様々な DLL を呼び出すことができます。現在多くのアプリケーションがこれを利用しており、エクスプローラや Microsoft Office が一例です。

リソース (Resource)
リソースは、アプリケーションや DLL などの実行可能ファイルに任意で含むことができるデータで、アプリケーション内で使用する文字列やビットマップ画像、アイコン、バージョン情報などが含まれます。また、多言語向けのアプリケーションを作成する際にも使用されます。リソースはアプリケーション作成時に追加されるので、通常の方法では編集できません。