2014年10月28日火曜日

Windows8以上で既定のプログラム一覧に表示されない罠

Tungstenにて既定のプログラムを設定できるようにするべく動作確認していたところ、 Windows 7では問題なくてもWindows 8.1で思わぬ罠に引っかかってしまいました。

既定のプログラムの設定一覧に表示させるには

MSDNの該当ページに、英語ながら詳細に記載されています。以下、簡略な手順。

  1. 所定の場所にレジストリを登録する(要管理者権限)
    HKLM\RegisteredApplicationsなど。
  2. 関連付けを更新したことをOSに通知する
    SHChangeNotify()をSHCNE_ASSOCCHANGEDを指定して呼び出します。
  3. 既定のプログラムの設定を開くように実装する
    IApplicationAssociationRegistrationUIをCoCreateInstance()でインターフェースの実体を作成し、 IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUIを呼び出します。
    ※Windows 8以降からプログラム側で勝手に関連付けをいじることはできない

レジストリ項目を登録したのにWindows 8.1では表示されない

Windows 7で問題なかったレジストリ項目をWindows 8.1にもそのまま登録し、試してみると なぜか既定のプログラムの設定一覧に表示されませんでした。

Process Monitorなどで原因をいろいろ探してみると、Windows 8以上では、バージョンリソースのうち「CompanyName」が見つからない場合は一覧に表示されないことが判明しました。

Windows 7まではそれがなくても問題がない上に、Web上でもこの情報が全くなかったので罠としか言いようがありません。 CompanyNameを入れるのは当たり前なんでしょうか? なぜこのような仕様にしたのか、理解に苦しみます。

その他制約

Windows 8からIApplicationAssociationRegistrationインターフェースが使えなくなった関係で、アプリ側から直接関連付けをいじることができなくなってしまいました。
したがって、インストーラーから直接既定のブラウザにすることはできません。 おそらく、マルウェアに悪用される(マルウェアによって関連付けを勝手に書き換えられて、ファイルを開く時に意図せずマルウェアを実行してしまう)などの理由で廃止してしまったのだろうと思います。
既定のプログラムの設定画面が出るという煩わしさはありますが、廃止された以上この方法しかありません。