2011年05月30日
Vista以降のヘルプシステムでWinhlp32用のヘルプファイル(備忘録)
Vista以降のOSでは、そのままでは 以前の形式のヘルプファイルが開けない。
チェックしてみたこと。
・ %SystemRoot%にWinhlp32.exe はあるのか? <ちゃんとあった
・ IHelpSystemのインターフェースは登録されているのか <ちゃんとあった
・ レジストリ内でのファイルの関連付けは? <ちゃんと関連付けしてある。
ということは、もう実行ファイルの問題としか考えられない。
WinHlp32.exeのファイルバージョンはどうなっているのかな
どうも、ファイルバージョンのメジャーバージョンとマイナーバージョンの部分は、osのそれと一致しているようだ。
2000なら 5.0.・・・ Win7なら 6.1.・・・
で、Vistaも7も Winhlp32をアップデートするとファイルバージョンが 50.1.・・・ へと変更される。
つまり、Vista以降(OSのメジャーバージョンが6以降)の場合は、%SystemRoot%にあるWinhlp32.exeのファイルバージョンのメジャーの部分が50になっていたら、Winhlp32はアップデートされていて、正常にヘルプファイルが開ける。 6.のままだったらヘルプファイルは開けずにWindowsヘルプとサポートのダイアログが表示される。
ということに 結論付けることに しよう というか もうこの判定方法しか思いつかないので いいにする。
追記
実行中のOSがなんなのかを取得するのに、単純にGetVersionExを使用しただけでは、アプリケーションが互換モードで実行されている場合、dwMajorVersionには、設定されている互換モードのメジャーバージョンが返ってきてしまい、 本当のOSが分からない。
なので、レジストリのCurrentVersionを調べることにしてみたら、これまた、アプリケーションが開始されるとアプリケーションからのレジストリ参照はバーチャルレジストリへの参照となるので、GetVersionExと同じ値が返ってくる。
いろいろ調べて、結局 アプリケーションの互換性の設定は、レジストリの
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
に記録されることとが分かり、ここを調べてみて GetVersionExの調査結果と照らし合わせて、本当のOSを判定することにした。
今回おまけで分かったのは、逆にさっきのレジストリを設定すると 互換性の設定がアプリケーション側から出来ること。
更に追記
互換性の設定を「すべてのユーザーの設定」で行うと、レジストリのルートキーはHKEY_CURRENT_USERではなくて、HKEY_LOCAL_MACHINEの方に記録されることが判明
なので両方をチェックして初めて、互換モードの設定が確定するのだ。
チェックしてみたこと。
・ %SystemRoot%にWinhlp32.exe はあるのか? <ちゃんとあった
・ IHelpSystemのインターフェースは登録されているのか <ちゃんとあった
・ レジストリ内でのファイルの関連付けは? <ちゃんと関連付けしてある。
ということは、もう実行ファイルの問題としか考えられない。
WinHlp32.exeのファイルバージョンはどうなっているのかな
どうも、ファイルバージョンのメジャーバージョンとマイナーバージョンの部分は、osのそれと一致しているようだ。
2000なら 5.0.・・・ Win7なら 6.1.・・・
で、Vistaも7も Winhlp32をアップデートするとファイルバージョンが 50.1.・・・ へと変更される。
つまり、Vista以降(OSのメジャーバージョンが6以降)の場合は、%SystemRoot%にあるWinhlp32.exeのファイルバージョンのメジャーの部分が50になっていたら、Winhlp32はアップデートされていて、正常にヘルプファイルが開ける。 6.のままだったらヘルプファイルは開けずにWindowsヘルプとサポートのダイアログが表示される。
ということに 結論付けることに しよう というか もうこの判定方法しか思いつかないので いいにする。
追記
実行中のOSがなんなのかを取得するのに、単純にGetVersionExを使用しただけでは、アプリケーションが互換モードで実行されている場合、dwMajorVersionには、設定されている互換モードのメジャーバージョンが返ってきてしまい、 本当のOSが分からない。
なので、レジストリのCurrentVersionを調べることにしてみたら、これまた、アプリケーションが開始されるとアプリケーションからのレジストリ参照はバーチャルレジストリへの参照となるので、GetVersionExと同じ値が返ってくる。
いろいろ調べて、結局 アプリケーションの互換性の設定は、レジストリの
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
に記録されることとが分かり、ここを調べてみて GetVersionExの調査結果と照らし合わせて、本当のOSを判定することにした。
今回おまけで分かったのは、逆にさっきのレジストリを設定すると 互換性の設定がアプリケーション側から出来ること。
更に追記
互換性の設定を「すべてのユーザーの設定」で行うと、レジストリのルートキーはHKEY_CURRENT_USERではなくて、HKEY_LOCAL_MACHINEの方に記録されることが判明
なので両方をチェックして初めて、互換モードの設定が確定するのだ。
ho_cad at 10:37│Comments(0)│TrackBack(0)│