Win7&2008R2: アプリケーション マニフェスト

マニフェストの基本的な内容は、Vista / 2008 と同様です。

UAC マニフェスト(exe の実行権限を定義する)

  • {ファイル名}.exe.manifest 内に定義(XML ファイル)
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

 level の値  意味
 asInvoker  親プロセスと同じ権限で動作
 highestAvailble  ユーザーが取得可能な権限で動作
 requireAdministrator  管理者権限で動作
 uiAccess の値  意味
 false  通常のアプリケーション
 true  UIPI の制限を回避
  • 添付方法
    exe に埋め込む(ビルド or MT.EXE)…埋め込みマニフェスト
    exe と同じフォルダに配置する…外部マニフェスト

注意点は 2 つあります。

  1. マニフェストの優先順位
    Vista 以降は 埋め込みマニフェスト を優先する
    Vista より前は 外部マニフェスト を優先する
  2. 外部マニフェストが有効にならない?
    OS が一度動作させた情報をキャッシュしてしまっているために、発生する。
    (パスと実行モジュールのタイムスタンプを見ている)
    こんなときには、タイムスタンプを変える(リビルド)とか、パスを変えるようにします。

そして、Windows 7 からは新しい項目「compatibility セクション」が追加されました。

compatibility セクション(互換性情報)(Windows 7 の新機能)

Compatibility セクションですが、Windows 7 & 2008 R2 からのサポートになります。
情報は以下の MSDN にありますので、目を通しておいた方がよいと思います。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--Windows 7-->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
      <!--Windows Vista-->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
    </application>
  </compatibility>
</assembly>

Compatibility セクションのないマニフェストをもつアプリケーションは Windows Vista モードで動作することになります。
ここは何気に重要なことを意味していて、これが

Windows Vista 用のアプリケーションは Windows 7 上でも互換性がある

という種明かしなんです。
こうなると、Windows 7 ネイティブモードって何?ってことになりますよね。

  • RPC Default Thread Pool
    7: RPC が NT スレッドプールを使う
    Vista: RPC がプライベートスレッドプールを使う
  • DirectDraw Lock
    7: DDARW のビデオバッファをロックできない
    Vista: DDARW のビデオバッファをロックできる
  • DirectDraw Bit Block Transfer (Blt) to Primary without Clipping Window
    7: クリッピングウィンドウ無しで Blt エリアに描画ができる
    Vista: Desktop Window Manager に従い、描画する
  • GetOverlappedResult API
    7: マルチスレッドで使用した場合の競合を解決する
    Vista: マルチスレッドで使用した場合、タイミングによっては期待した結果が得られない
  • Program Compatibility Assistant (PCA)
    7: PCA を使わない
    Vista: PCA を使う

この Compatibility セクションにある supportedOS ですが、OS 種別を GUID で記述する必要があるようで
注意が必要です。間違えないようにしないといけませんね。
Visual Studio 2008 で使うには、こんな使い方になると思います。

  1. Compatibility セクションを記述したマニフェストを用意して、プロジェクトの Resource Files に追加する
  2. プロジェクトの構成プロパティで、マニフェスト ツール の”追加のマニフェスト ファイル”で作成したマニフェストを追加
  3. ビルドする

VS のエディタは、XML ファイルを作成するときにも便利なので、使わないとね。
そして、最後に Compatibility セクション の確認方法を紹介します。
やはり、作成したアプリケーションがどっちのモードで動いているのか知りたいですよね。
これには、Windows 7 のリソースモニターを使います。

こんな感じで、オペレーティング システムのコンテキストという項目に表示されます。
ここを見ると、Windows 7 モードなのか、Windows Vista モードなのかがわかります。

よーく見ると、OS コンポーネントでも Windows Vista モードで動いているものが目立ちますね。

One Response to Win7&2008R2: アプリケーション マニフェスト

  1. ピンバック: Win8 & 2012: アプリケーション マニフェストの SupportedOS « re-Think things

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。