読者です 読者をやめる 読者になる 読者になる

流れるまにまに。

のんびり人の日々のめも。

【C++】マニフェストファイルの対応OS記載について【インストーラ】

C/C++

InstallShieldにて、OSによってインストールするドライバを変える処理をInstall Script内で行っていました。

10対応で、10のみ新しいドライバをインストールする!
ってなった時になんだかうまく動かなかったのでメモ。

 

Install Scriptはこんな感じ

////////////////////////////////////////////////////////////////////////

File Name: Setup.rul
//////////////////////////////////////////////////////////////////////
  ~~色々
   // Windows 7/8/8.1
 if ((SYSINFO.nWinMajor = 6) && ((SYSINFO.nWinMinor = 1) || (SYSINFO.nWinMinor = 2) || (SYSINFO.nWinMinor = 3))) then
             //インストール処理;
 elseif(SYSINFO.nWinMajor = 10) then
            // 10用インストール処理
    else
            //その他ドライバインストール処理
    endif;
//////////////////////////////////////////////////////////////////////

 

どう頑張っても、10のドライバがインストールされない。
条件文は合っているはずなのに。。。

調べたらこういうことらしい
「アプリケーションマニフェストのSupportOSで明示的な宣言をしないと、取得するOSのバージョンがマニフェストに記載された最大値になる」


参考:Win10: OS のバージョン | re-Think things

 

 

InstallShield用のScriptは中でGetVersionEx()呼んでるかな。
バージョン表示処理を入れたら、案の定Windows10環境で"6.2"と表示されていました。

 

今回のインストーラが埋め込むマニフェスト"SetupExe.Highest.manifest
"のcompatibilityセクションを以下に書き換えて対応。

 

マニフェストファイルを探すのに手間取ったので、一応メモ
C:\Program Files (x86)\InstallShield\2013\Support\SetupExe.Highest.manifest)

 

/////////////////////////////////////////////////////////////////////////////////////////

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!– Windows 10 –>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!– Windows 8.1 –>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!– Windows 8 –>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!– Windows 7 –>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!– Windows Vista –>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>

/////////////////////////////////////////////////////////////////////////////////////////////////////

 

再度ビルドして試したら無事動きました(*'ω'*)

 

これ前回までは7~8.1までOS分けてなかったからよかったけど、
うっかり分けてたらバグってたのかも。

よかったよかった。