UACは強敵だったSXF3.1の書き出しをちょっだけ変更しました

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の方に記録されることが判明

 なので両方をチェックして初めて、互換モードの設定が確定するのだ。


ho_cad at 10:37│Comments(0)TrackBack(0)

トラックバックURL

コメントする

名前
 
  絵文字
 
 
UACは強敵だったSXF3.1の書き出しをちょっだけ変更しました