開発者として、構成/オプションをレジストリに保存するツールは私の人生の悩みの種です。これらのオプションへの変更を簡単に追跡できず、マシンからマシンへの移植も容易ではありません。これらすべてが、.INI ファイルの古き良き時代を本当に切望しています...
独自のアプリケーションを作成する場合、旧式の構成ファイルではなく、レジストリに何を入れることを選択する必要がありますか? また、その理由は何ですか?
ユーザーの観点とプログラマーの観点の両方からこれを考えると、ファイルの関連付けやマシン固有の設定のようなものでない限り、レジストリに何かを入れる良い言い訳は本当にないと言わざるを得ません。
私は、プログラムはインストールされている場所ならどこからでも実行可能であり、インストールはマシン内、または別のマシンに完全に移動可能であり、実行に影響を与えないようにする必要があるという考え方から来ています。
構成可能なオプション、または必要なdllなどが共有されていない場合は、インストールディレクトリのサブディレクトリに配置して、インストール全体を簡単に移動できるようにする必要があります。
私はプログラムのような小さなユーティリティをたくさん使っているので、USBスティックにインストールして別のマシンに接続して実行することができない場合は、私には向いていません。
いつ-レガシー統合のため、または顧客のシステム管理者が「そうなるはずだ」と言ったため、またはXMLの使用をより困難にする古い言語で開発しているために強制されます。
理由-主に、レジストリは、アプリケーションの隣にある構成ファイルをコピーするほど移植性がないためです(ほとんど同じように呼び出されます)。
.Net2 +を使用している場合は、App.ConfigファイルとUser.Configファイルがあり、レジストリにDLLを登録する必要がないため、DLLに近づかないでください。
構成ファイルには独自の問題がありますが(以下を参照)、これらはコード化でき、アーキテクチャを変更できます。
Microsoftのポリシー:
レジストリはマシンに依存します。遅くなり、必要なものを見つけるのがほとんど不可能なので、私はそれが好きではありませんでした。そのため、単純なiniファイルやその他の設定ファイルが好きです。それらがどこにあるか(アプリケーションフォルダーまたはユーザーフォルダー)がわかっているので、持ち運びが簡単で、人間が読める形式になっています。
いくつかのウィンドウ位置と最近使用したアイテムのリストをWindowsレジストリに保存すると、世界は終わりますか?これまでのところ、問題なく動作しています。
HKEY-CURRENT-USERは、些細なユーザーデータを少量保存するのに最適な場所です。それが目的です。他の人がそれを悪用したという理由だけで、その意図された目的のために使用しないのはばかげているようです。
レジストリの読み取りと書き込みはスレッドセーフですが、ファイルはそうではありません。したがって、プログラムがシングルスレッドかどうかによって異なります。
ユーザーの移動プロファイルで使用できるようにする設定は、実際にユーザーの Application Data フォルダーを手動で探す努力を実際に行いたくない場合を除いて、おそらくレジストリに入れる必要があります。:-)
新しいアプリを開発していて、移植性を気にする場合は、他のOSに(Windows)レジストリがないため、Windowsレジストリにデータを保存しないでください(注意-これは明らかかもしれませんが、見落とされがちです)。
Winプラットフォーム用にのみ開発している場合は、できるだけ避けてください。構成ファイル(おそらく暗号化されている)は、はるかに優れたソリューションです。レジストリにデータを保存してもメリットはありません(たとえば、.NETを使用している場合は、分離ストレージの方がはるかに優れたソリューションです)。
少し本題から外れますが、移植性について懸念している人を見かけるので、私がこれまでに使用した最良のアプローチは Qt の QSettings クラスです。設定の保存を抽象化します (Windows ではレジストリ、Mac OS では XML 設定ファイル、Unix では Ini ファイル)。クラスのクライアントとして、レジストリやその他のことについて頭を悩ませる必要はありません。Just Works (tm) です。
.NETでは、実際には必要はありません。
これを行うためにプロジェクトプロパティを使用する方法を示す2つの例を次に示します。
これらの例は、Windowsユーザープロジェクトのプロパティによってこれを行いますが、アプリケーションでも同じことができます。
詳細はこちら:
通常、レジストリに設定を入れない場合は、主に現在のWindows設定の取得、ファイルの関連付けの変更などに使用し
ます。ソフトウェアが既にインストールされているかどうかを検出する必要がある場合は、レジストリに最小限のエントリを作成できます。 、それはあなたがどんな設定でも見つけることができる場所です。または、アプリケーションデータで指定された名前のフォルダを検索します。
Document and Settingsフォルダーを見ると、フォルダーの設定にUnixドット表記を使用しているソフトウェアがたくさんあります。.p4qt.sqlworkbench .squirrel-sql .SunDownloadManager .xngr .antexplorer .assistant .CodeBlocks .dbvis .gimp-2.4 .jdictionary .jindent .jogl_ext(など)
アプリケーションデータでは、エディタ名またはソフトウェア名が付いたさまざまなフォルダ。少なくともポータブルアプリケーションの間では、現在の傾向のように見えます...
WinMergeはわずかに異なるアプローチを使用し、データをレジストリに保存しますが、構成ダイアログでオプションのインポートとエクスポートを提供します。
個人的には、レジストリを使用して、(アン)インストールスクリプトで使用するインストールパスを保存しました。これが唯一の可能な選択肢であるかどうかはわかりませんが、賢明な解決策のように思えました。もちろん、これはWindowsでのみ使用されていたアプリ用でした。
Windows レジストリは良いアイデアだったと思いますが、アプリケーション開発者による悪用と、Microsoft によって推奨/義務付けられていない標準ポリシーが手に負えない獣に成長したためです。あなたが言及した理由で私はそれを使うのが嫌いですが、それを使うのが理にかなっている場合があります: