VC2005Expressだとデフォルトで以下のリンカオプションになる
1 |
/MANIFEST /MANIFESTFILE:"Debug\46464.exe.intermediate.manifest" |
VC2008Expressだとデフォルトで以下のリンカオプションになる
1 |
/MANIFEST /MANIFESTFILE:"Debug\sdsdsda.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false' |
2008以降のリンカは /MANIFESTがあるとデフォルトでUACのレベルがasInvokerになる。manifestでUACが指定されていればVirtual Storeが働かなくなる。
/MANIFESTUACは2008から追加されたオプション。
/MANIFESTFILEはリンカが出力するファイル。
manifestは実行ファイルのリソース(RT_MANIFEST)に追加される。
ではVSのプロジェクト設定のマニフェストツールとは何か
ビルドログを見るとmt.exeはリンカの後に実行されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Creating temporary file "c:\T\def2eight\def2eight\Release\RSP00000348443160.rsp" with contents [ /O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Yu"stdafx.h" /Fp"Release\def2eight.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /c /Zi /TP .\def2eight.cpp ] Creating command line "cl.exe @c:\T\def2eight\def2eight\Release\RSP00000348443160.rsp /nologo /errorReport:prompt" Creating temporary file "c:\T\def2eight\def2eight\Release\RSP00000448443160.rsp" with contents [ /O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Yc"stdafx.h" /Fp"Release\def2eight.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /c /Zi /TP .\stdafx.cpp ] Creating command line "cl.exe @c:\T\def2eight\def2eight\Release\RSP00000448443160.rsp /nologo /errorReport:prompt" Creating command line "rc.exe /d "_UNICODE" /d "UNICODE" /fo"Release/def2eight.res" .\def2eight.rc" Creating temporary file "c:\T\def2eight\def2eight\Release\RSP00000548443160.rsp" with contents [ /OUT:"C:\T\def2eight\Release\def2eight.exe" /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"Release\def2eight.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\T\def2eight\Release\def2eight.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ".\Release\stdafx.obj" ".\Release\def2eight.obj" ".\Release\def2eight.res" ] Creating command line "link.exe @c:\T\def2eight\def2eight\Release\RSP00000548443160.rsp /NOLOGO /ERRORREPORT:PROMPT" Creating temporary file "c:\T\def2eight\def2eight\Release\RSP00000648443160.rsp" with contents [ /outputresource:"..\Release\def2eight.exe;#1" /manifest .\Release\def2eight.exe.intermediate.manifest ] Creating command line "mt.exe @c:\T\def2eight\def2eight\Release\RSP00000648443160.rsp /nologo" Creating temporary file "c:\T\def2eight\def2eight\Release\BAT00000748443160.bat" with contents [ @echo Manifest resource last updated at %TIME% on %DATE% > .\Release\mt.dep ] Creating command line "c:\T\def2eight\def2eight\Release\BAT00000748443160.bat" |
link.exeが終わった後にmt.exeが実行されており、以下のオプションで実行されていることがわかる。
1 2 |
/outputresource:"..\Release\def2eight.exe;#1" /manifest .\Release\def2eight.exe.intermediate.manifest |
/manifestで指定されたファイル(.\Release\def2eight.exe.intermediate.manifest)を..\Release\def2eight.exeのRT_MANIFESTに埋め込んでいるんだと思われる。def2eight.exe.intermediate.manifestはリンカがはいたファイル。#1はRT_MANIFEST配下のオーディナル番号だろう。
よくわからないがリンカはリソースにマニフェストを埋め込む機能はなくmt.exeがそれをやっているということか。
最後に自身のプロセスがVirtual Store有効になっているかどうかはプロセスのトークンがTokenVirtualizationEnabledを持っているかでわかる。前にも書いたようにマニフェストでUACレベルを設定していればこれは無効になる。VS2008で作ったアプリはデフォルトで無効になる。VS2005ではUACレベルが設定されていないので有効になる。それ以前のアプリはマニフェストがそもそもないので有効になる。