Windows Vista 以降、Microsoft は互換性シムのクラスを追加しました。これにより、アプリケーションが管理ファイルとレジストリへのアクセス権を持っていることを前提として、引き続き機能することができます。
つまり、Windows XPで失敗したアプリケーションは、 Windows Vistaで実行されます。
これらの OS 提供のバグ修正は、アプリケーション マニフェストにセクションを追加し、アプリケーションを実行する必要があることを宣言することで無効にすることができasInvoker
ます。
<!-- Disable Windows Vista standard user compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"/>
</requestedPrivileges>
</security>
</trustInfo>
理想的には、開発者はアプリケーションをテストして、(不必要に) 管理者特権を必要としないことを確認します。これをテストするには、asInvokerとしてマニフェストする必要があります。
しかし、結局のところ、 asInvoker としてマニフェストされた顧客にアプリケーションをリリースするつもりはありません。何かを見逃したとしても、ユーザーに影響を与えたくありません。Microsoft のオペレーティング システムに間違いを修正してもらいたいです。このソリューションの問題は次のとおりです。
- リリース前にマニフェストを変更する必要があります
- Windows Vista で動作するだけなので、見逃したことについては決して知りません。
同様の難問が、Windows 7 のsupportedOSのマニファイスト全体で発生します。設計およびテストされた Windows のバージョンを示すマニフェストをアプリケーションに追加できます。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
サポートされている OS 項目の場合、オペレーティング システムは、どの OS 向けに設計されているかを事前に認識しています。これにより、Windows 7 をサポートしていない場合、アプリケーションは Windows Vista のコンテキストに配置されます。
(ソース: msdn.com )
このアクションは、一部の互換モードでアプリケーションを実行するのと似ています。たとえば、次のようになります。
- Windows Server 2008 (サービス パック 1)
- Windows Vista (サービス パック 2)
- Windows Vista (サービス パック 1)
- Windows ビスタ
- Windows Server 2003 (サービス パック 1)
- Windows XP (サービス パック 2)
- ウィンドウズ2000
- Windows NT 4.0 (サービス パック 5)
- ウィンドウズ 98 / ウィンドウズ ミー
- Windows95
ここで、互換性シムの schmorgasboard が適用され、Windows は文書化されていない古い動作をエミュレートして、文書化されていない動作に依存しているときにアプリがクラッシュするのを防ぎます。
Windows 7 がWindows Vistaコンテキストで実行されるアプリケーションに提供する互換性シムの例:
- RPC は、OS スレッド プールではなく、古いプライベート スレッド プールを使用します。
- プライマリ ビデオ デスクトップ ディスプレイ バッファをロックできます。
- クリッピング ウィンドウを指定せずに、プライマリ デスクトップ ビデオ バッファにブリットできます。
- GetOverlappedResult 競合状態に対して脆弱になります (それに依存している場合)
- Program Compatibilty Assistant (PCA) 緩和策を引き続き取得します。
また、 Windows 7でアプリケーションを適切にテストするには、 supportsOSマニフェスト エントリを追加する必要があります。しかし、繰り返しになりますが、これらのシム (PCA など) の利点を失いたくないので、そのフラグを付けてアプリケーションを出荷するつもりはありません。また、アプリに問題があり、それがVistaコンテキストで実行されていたために修正された場合: アプリは機能しているだけなので、顧客からそれについて知ることはありません。
考え?ガイダンス?ベストプラクティス?