ソフトウェアの設定を保存するには、レジストリを使う方法とINIファイルを使う方法があります。そして、現在これらはソフトの作者によってどちらかが選ばれて使われている状況です。ここで、それぞれの方式の特徴と問題の解決策をいくつか示します。
いきなりですが、ここで比較表を示します。
比較項目 | レジストリ | INIファイル |
現在のMSによる推奨状況 | ○推奨 | ×非推奨 |
マルチユーザ対応 | ○ | × |
設定のサイズ制限(*) | ○各ソフトでの制限は無い | ×32KB |
実装のしやすさ(*) | ○ | × |
バイナリデータの保存 | ○ | × |
データの階層化 | ○ | × |
初心者に間違って消される可能性 | ○小さい | ×大きい |
他のソフトへの設定の読み込み | ○容易 | ×困難 |
バックアップ | ×困難(特にマルチユーザ時) | ○容易 |
ソフトの完全アンインストール | ×困難 | ○容易 |
編集のしやすさ | × | ○ |
OSへの影響 | ×あり | ○なし |
複数ユーザ間での設定の共有 | × | ○ |
注:(*)のついているのは開発環境や実装方法によって変わることがあります。ついていないものでも多少は変わることがあります。
まずはレジストリから見てみましょう。MSがレジストリを推奨しているのは、マルチユーザ対応というところが大きいでしょう。(ここでのマルチユーザというのは、OSへのログオンを行うユーザが複数居るという状況を想定しています。)INIファイルでは誰が使っても同じファイルを使うため、各個人の設定を保存することはできません。しかし、レジストリならログオン時に各ユーザの設定に切り替わる場所(具体的にはHKEY_CURRENT_USER)があるので、その下に設定を書くようにすればマルチユーザでも各自の設定をすることができます。また、NT系OSで、ファイルを置く権限が無くとも自分のレジストリ書き込みの権限があれば設定を保存できるので、これもマルチユーザ対応と言われる理由でしょう。あと、比較表にある「他のソフトへの設定の読み込み」というのは、例えばあるソフトAがインストールされていればその場所を調べて、別のソフトBがソフトAと連携する、といった状況で容易であることを示しています。INIファイルの場合はソフトBの中で手動で場所を設定するか、又はHDD全体の中からソフトBが強引に探し出すことになります。
次にINIファイル。INIファイルはWindowsで以前に採用されていた方式であり、1つのテキストファイルに1つのソフトの設定が書かれるのが普通です。昔はWindowsのシステムドライブに置かれることが多く、利用ソフトが増えてくるとWindwsのディレクトリは設定ファイルでいっぱいになってしまう、という状況でしたが、現在はほぼ例外なく実行ファイルと同じディレクトリ(もしくはそのサブディレクトリ)に置かれるようになっています。なお、この記事の中では、INIファイルでなくても外部テキストファイルとして設定を保存するものをINIファイルを使う、と総称します。
それぞれの問題点を見てみましょう。まずはレジストリ。やはり、システムへの影響です。OSの動作に必要なファイル(というかある意味データベース)を大きくしていってしまうので、他のソフトにも影響を与え、OSを不安定にする要因にもなってしまいます。しかも、アンインストーラが無いソフトでは、ソフトが不要になっても消されるのが実行ファイルだけなので、システムへの影響は恒久的に残ります。また、バックアップが困難なことも挙げられます。レジストリエディタの使い方を知っていれば自分の設定をバックアップしておくのは可能ですが、かなり面倒です。また、何らかの事情でOSが起動不能な状態になったりした場合、各ソフトの設定もOSとともに消えてしまうことになります。
INIファイルではマルチユーザへの対応ができない点が問題です。各個人ごとにソフトを入れてしまえば大抵は何とかなるのですが、同じソフトをいくつも入れるというのも効率が悪いのは明らかです。
ソフトの設計者としてはこれらを考慮した上でどちらかを選ぶことになるのですが、それぞれの方法から問題点をできるだけ少なくする方法というのもあります。基本的には、片側を基本としつつももう片方の仕組みのいいところを取り入れるという感じでしょうか。
レジストリ側からのアプローチとしては、設定をINIファイルのように外部に書き出したり読み込んだりできるようにすることです。このようにすれば、バックアップもある程度簡単になります。(拙作ソフトでは、NumLoad 1.2.0以降で実装されています。)OSが起動不能になったときに備えるなら、レジストリにデータを保存すると同時にINIファイルを書き出し、起動時にはレジストリから読もうとするけどもし自分のソフトの設定がされてないならINIファイルを探してそこから読む、という感じにすればいいかもしれません。ただ、これは要するにレジストリとINIの併用方式であり、INIの問題点も一部引き込んでしまうので注意が必要です。(特にマルチユーザ関連。)
もうひとつ、アンインストーラがないと設定がレジストリに残ってしまうというものですが、アンインストーラは無くともレジストリから該当ソフトの設定を削除するツール(以下レジストリデリータ)を作るのは、レジストリにアクセスするソフトを作れる人には簡単でしょうから、ソフトにレジストリデリータをつけるという方法で解決するのがいいかもしれません。(拙作ソフトでレジストリを使用するソフトの全ての正式バージョンにはレジストリデリータをつけています。)
INIファイル側からのアプローチですが、私がレジストリ派(※1)なので、INIファイル形式の例としてK2氏のK2Editorを挙げさせていただきます。K2Editorを使ってみて分かるのは、実行ファイルのあるディレクトリの下にユーザ名のディレクトリが作られ、そこに各個人の設定が保存されていくことです。これはつまり、INIファイルでマルチユーザ対応を実現しているということです。NT系OSでは、ディレクトリのアクセス権限などをしっかり設定しておけば他の人に設定を見られることも無いですし、マルチユーザ対応としてはレジストリと同レベルに好ましい形になっているといえます。K2Editorの作者の方も書かれているのですが、副作用としてネットワーク越しのアクセスの場合もマルチユーザ設定をそのまま適用できるようになります。ただし、アクセス権を設定した場合は、結局OS付属のバックアップツールを使わないとバックアップを取れなくなるので、INIのバックアップの容易性というものが失われます。レジストリ側からのアプローチと比べると、セキュリティ的な面での管理の徹底が大変かもしれないですが、それでもシステムへの影響は小さくなるので、この方式のほうがいいことが多いのではないでしょうか。
ただし、レジストリの利点のところで書いた「他のソフトからの設定の読み取り」というのは他のソフトのINIファイルがどこにあるか分かるわけがないので、INIファイルでは不利です。また、設定を行うのが試用期間があるシェアウェアの場合はINIファイル利用はかなりつらいものがあります。というのも、データを保存している場所が分かりやすいので、使用期限を何度でもリセットできてしまうという問題があるためです。まぁ、レジストリの場合にしても場所さえ判明してしまえば一緒なので大した問題ではないのかもしれませんけど..
ということで、結局どちらの方が絶対いい、というのはありませんが(※2)、そのソフトに応じてどちらかの方式をベースに問題が発生しにくいようにちょっと工夫を加えてみるということになるのではないでしょうか。