最近、 Java でデスクトップ ・ ブリッジ UWP アプリの開発に取り組んでいます。その中で、 既定では存在しないレジストリのいくつかを読み取る必要が出てきました。既定では存在していないレジストリなので、 なんらかの方法で事前に書き込みをしておかなければなりません。
デスクトップ ・ ブリッジでは権限があればレジストリへの書き込みもできるようですが、 できることなら権限を要求せずに解決したいところです。そこで、 デスクトップ ・ ブリッジ UWP の仮想化されたレジストリ機能を使ってみることにしました。
デスクトップ ・ ブリッジ UWP アプリではレジストリへのアクセスが可能です。これは、 リダイレクトによって実現されています。詳細は下記マイクロソフトのサイトで解説されています。
registry.datとは
マイクロソフトのサイトの解説によると、 UWP パッケージ内に registry.dat
というファイルを同梱しておくと、 HKLM\SOFTWARE レジストリ配下の読み取り時に registry.dat
が参照されるようになる、 とのこと。
なるほど、 仕組みが分かってきました。ですが、 肝心の registry.dat
の構造や作り方については説明されていません。
いろいろと調べた結果、 registry.dat
はハイブと呼ばれるバイナリー形式のファイルであることが分かりました。よく使われているテキスト形式のレジストリ ・ ファイル (拡張子 .reg
) とは異なります。
Desktop App Converter を使えば registry.dat
が自動的に作成されるようですが、 私は MakeAppx コマンドで UWP パッケージを作成しているので、 自前で registry.dat
を用意する必要がありました。
registry.datを作る手順
ここからは、 具体例を交えながら registry.dat
の作成手順を説明していきます。
私が開発しているアプリでは JPKI ライブラリを参照するために以下のレジストリキーが必要でした。
- HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Cryptography\Defaults\Provider\JPKI Crypto Service Provider
- HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Cryptography\Defaults\Provider\JPKI Crypto Service Provider for Auth
- HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Cryptography\Defaults\Provider\JPKI Crypto Service Provider for Sign
これらのレジストリキーを registry.dat
に収めて、 UWP アプリからレジストリ参照できるようにしていきます。
1. レジストリをエクスポートする
※ 作業用 PC に必要なレジストリを登録しておいてください。
レジストリ エディター (regedit.exe
) を起動して、 レジストリの必要な部分をエクスポートします。後でテキストエディターを使って編集するので余計な部分を含んでいても問題ありません。
ファイルの種類は 登録ファイル (*.reg)
にします。ファイル名は適当に付けてかまいません。
2. レジストリファイルを編集する
エクスポートしたレジストリファイル (.reg
) をテキストエディターで開きます。(.reg
ファイルは UTF-16LE 形式です。UTF-16LE に対応しているテキストエディターを使用してください。メモ帳でも大丈夫です。)
余分なレジストリキーを削除する
レジストリの範囲を広くエクスポートしていた場合は、 余計なレジストリキーを削除します。
レジストリキーのプリフィックスを置換する
テキストエディターの置換機能を使って [HKEY_LOCAL_MACHINE\SOFTWARE\
を [HKEY_CURRENT_USER\_REGISTRY_DAT_WORK\
に置換します。(置換先には任意の名前が付けられますが、 HKEY_CURRENT_USER 配下でレジストリに存在していない名前を付けてください。)
置換後、 すべてのレジストリキーは HKEY_CURRENT_USER\_REGISTRY_DAT_WORK\
で始まっています。
編集した内容を UTF-16LE 形式で保存します。(メモ帳の場合は文字コードとして Unicode
を選択してください。)
3. 編集したレジストリファイルをインポートする
編集したレジストリファイル (.reg
) をダブルクリックしてレジストリにインポートします。(REG IMPORT
コマンドでインポートすることもできます。)
確認ダイアログが表示されるので、 はい をクリックします。
編集した内容がレジストリに追加されました。
レジストリ エディター (regedit.exe
) を起動して内容を確認します。UWP アプリ実行時に参照したいレジストリ HKEY_LOCAL_MACHINE\SOFTWARE の内容が HKEY_CURRENT_USER\_REGISTRY_DAT_WORK の配下に作成されていれば OK です。
4. レジストリをハイブ形式で保存する
コマンドプロンプトを 「管理者として実行」 して、 REG SAVE
コマンドを実行します。
REG SAVE "HKCU\_REGISTRY_DAT_WORK" C:\temp\registry.dat
これで、 HKEY_CURRENT_USER\_REGISTRY_DAT_WORK 配下のレジストリがハイブ形式で registry.dat
に保存されます。REG SAVE ではルートキーである HKEY_CURRENT_USER を HKCU と省略して指定することができます。
管理者: コマンドプロンプトMicrosoft Windows [Version 10.0.17763.503] (c) 2018 Microsoft Corporation. All rights reserved. C:¥WINDOWS¥system32>REG SAVE "HKCU¥_REGISTRY_DAT_WORK" C:¥temp¥registry.dat この操作を正しく終了しました。
このハイブ形式のファイル (registry.dat
) には、 以下のレジストリキーが相対位置として格納されています。
- Microsoft
- Cryptography
- Defaults
- Provider
- JPKI Crypto Service Provider
- JPKI Crypto Service Provider for Auth
- JPKI Crypto Service Provider for Sign
- Provider
- Defaults
- Cryptography
レジストリファイル (.reg
) の場合は、 HKEY_LOCAL_MACHINE 等のルートキーを含む絶対位置指定でレジストリキーが保存されますが、 ハイブは絶対位置を保存していません。
このハイブ (registry.dat
) をデスクトップ ・ ブリッジ UWP パッケージに同梱すると、 レジストリの HKEY_LOCAL_MACHINE\SOFTWARE 直下にロードされたかのように参照できます。つまり、 アプリ実行時には以下のレジストリキーが存在している状態になります。
- HKEY_LOCAL_MACHINE
- SOFTWARE
- Microsoft
- Cryptography
- Defaults
- Provider
- JPKI Crypto Service Provider
- JPKI Crypto Service Provider for Auth
- JPKI Crypto Service Provider for Sign
- Provider
- Defaults
- Cryptography
- Microsoft
- SOFTWARE
より正確に言えばロードではなくマージです。ハイブ (registry.dat
) に含まれている上記のレジストリキーはハイブ (registry.dat
) から参照され、 ハイブ (registry.dat
) に含まれていないその他のレジストリキーはシステム自体のレジストリから検索されます。
5. レジストリを片付ける
作業の過程で、 レジストリに HKEY_CURRENT_USER\_REGISTRY_DAT_WORK というキーを作ってしまいました。もう、 HEKY_CURRENT_USER\_REGISTRY_DAT_WORK は必要ないので削除しておきましょう。
コマンドプロンプトで次のコマンドを実行すると、 HKEY_CURRENT_USER\_REGISTRY_DAT_WORK 配下がまるごと削除できます。
REG DELETE "HKCU\_REGISTRY_DAT_WORK" /f
「この操作を正しく終了しました。」 と表示されれば OK です。
管理者: コマンドプロンプトC:¥WINDOWS¥system32>REG DELETE "HKCU¥_REGISTRY_DAT_WORK" /f この操作を正しく終了しました。
registry.datはどこに置くの?
作成した registry.dat
は、 UWP パッケージのルートフォルダーに配置します。つまり、 AppxManifest.xml
と同じフォルダーです。
このようなフォルダー構成で appx パッケージを作成すれば、 アプリ実行時に registry.dat
が仮想化されたレジストリとして参照されます。ファイル名は必ず registry.dat
としてください。他のファイル名では仮想化レジストリとして認識されません。(大文字 ・ 小文字の違いは影響しないので Registry.dat
などでも大丈夫です。)
MakeAppx コマンドを使ってパッケージを作成する手順については、 以下の記事も参考にしてみてください。
- 2018-11-28 デスクトップ ・ ブリッジを使って Java アプリを UWP アプリにしよう
デスクトップ ・ ブリッジ UWP アプリで参照可能なレジストリハイブ (registry.dat
) の作成手順の紹介は以上です。