レジストリキーの最終更新日時取得はRegOpenKeyから

「PCのソフトウエアのインストール日を取得しようとしても、そもそもレジストリに値として登録されていない場合がある。」これが事の始まりでした。

実際、レジストリエディタで、HKEY_LOCAL_MACHINE直下
32ビットアプリの場合はSoftware\Microsoft\Windows\CurrentVersion\UnInstall
64ビットアプリの場合はSoftware\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
のサブキーの値を照会すると、確かにInstallDateの登録がないものが多数あったのです。

それではそもそも値として登録がない場合、Windowsのコントロールパネルは何をもとにインストール日を表示しているのか。

どうやら、「Windowsはレジストリキーへの書込み日時で便宜的に置き換えているらしい。」ということがわかって、どうしてもその日時(最終更新日時になります)を取得したくなったのです。

それには、Win32/64APIが必須。これをExcelVBAで実現すべく試行錯誤の結果、RegOpenKeyExでレジストリキーへの権限を取得して、RegEnumKeyExでサブキーの情報列挙の際に最終更新日時を取得するコードを書いたのですが、なぜかRegOpenKeyExでハンドルは取得できても、そのハンドルでRegEnumKeyExを実行するとエラーを吐いて先へ進みません。

ExcelVBAでのWinAPI情報が少ない中、ネットでいろいろ検索すると、ある方がレジストリサブキーを列挙するコードをアップしておられました。そのコードをみるとRegCloseKeyでレジストリキーを開いているではありませんか。RegOpenKeyは古いWindowsへの互換性のために残されているAPIで、現在はRegOpenKeyExを使うとあったのに…。

ちなみに私のコードをこのRegOpenKeyに書き換えてハンドルを取得、そのハンドルでRegEnumKeyExを実行するとなんとエラーを吐かずに最終更新日時が取得ができたではありませんか。えー。これを使えば、後はFILETIME構造体で取得されたその最終更新日時をSYSTEMTIMEに変換するだけです。

ということで、
1.RegOpenKeyで、レジストリキーへのハンドル(権限)を取得
2.RegEnumKeyExで、レジストリサブキーの最終更新日時を取得
3.FileTimeToSystemTimeで、最終更新日時をSYSTEMTIMEに変換
という手順になりました。

それにしてもなぜなのかわかりません。相性の問題でしょうか?

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント