sakura
sakura copied to clipboard
manifest ファイルの processorArchitecture が x86 になっている
manifest ファイルの processorArchitecture が x86 になっている
https://github.com/sakura-editor/sakura/blob/ef37d0202496f66161b34a28412c46c92379cb93/resource/sakura.exe.manifest#L5
参考 http://yasu1973fc2.blog99.fc2.com/blog-entry-76.html
それは何かの事情で exe に manifest を埋め込みたくない人が 自分の環境向けに編集して使うためのテンプレートだと認識しとります。
確認できてないですが、MinGWビルドでこれ使ってます? そうだとするとMinGW向けビルドスクリプトで操作しないといかんですね。
VC++ビルドは、対象アーキテクチャに応じてリンカに渡すコマンドを切り替えてるので x64ビルドすれば x86 じゃなく amd64 の manifest が生成されます。
https://github.com/sakura-editor/sakura/blob/ef37d0202496f66161b34a28412c46c92379cb93/sakura_core/StdAfx.h#L26-L35
埋め込まれたマニフェストを確認するには vs2017 で exe を開いてください。 manifestファイルは RT_MANIFEST 形式のバイナリデータとして埋め込まれています。 RT_MANIFEST 形式のリソースの言語識別子が「英語(en-us)」なのは仕様っぽい :smile:
pragma comment(linker, "linker-options") は MinGW(gcc) では使えなかった気がするので、 x64 対応するなら手を考えないといけないトピックだと思っています。
埋め込まれたマニフェストを確認するには vs2017 で exe を開いてください。 manifestファイルは RT_MANIFEST 形式のバイナリデータとして埋め込まれています。 RT_MANIFEST 形式のリソースの言語識別子が「英語(en-us)」なのは仕様っぽい
mt.exe を使うと簡単です。 以下を実行すると out.manifest に出力します。
mt.exe -inputresource:sakura.exe;#1 -out:out.manifest
pragma comment(linker, "linker-options") は MinGW(gcc) では使えなかった気がするので、 x64 対応するなら手を考えないといけないトピックだと思っています。
makefile で mt.exe を呼べばいいと思います。
ただ MinGW と VC で manifest の処理が異なるのは好ましくないので、 pragma は廃止して、VC の manifest の設定で manifest ファイルを 指定するまたは postBuild で mt.exe を呼ぶ方法に変えたほうがいいと思います。
mt.exe -outputresource:sakura.exe;#1 -manifest sakura.exe.manifest
https://msdn.microsoft.com/ja-jp/library/ms235591.aspx
ただ MinGW と VC で manifest の処理が異なるのは好ましくないので、 pragma は廃止して、VC の manifest の設定で manifest ファイルを 指定するまたは postBuild で mt.exe を呼ぶ方法に変えたほうがいいと思います。
pragma指定を廃止するのは構いません。 その場合、processorArchitecture="*" を指定して、 実行時に processorArchitecture を判定させることになると思います。 判定する主体は windows というか win32 サブシステムです。 無視できる程度だとは思いますが、起動時間は延びそうです。
VC(MsBuild) は元々mt.exeを使っています。 ビルド設定に「マニフェストツール」の項目がありますが、これが mt.exe の設定です。 頻繁に使われる設定の一部は ビルド設定(vcxproj) から指定できるようになっています。 せっかくの機能なので、できれば活かしたいな、と思っています。
リンカオプションには UAC関連の manifest オプションが混ぜ込まれています。
マニフェストツールオプションには DPI認識と追加ファイル の設定項目があります。
VC(MsBuild)がビルドステップを踏む際の manifest 関連の動きは以下のような感じです。
- cppに記述した pragma がリンカに渡される
- 渡されたコマンドとオプションを元にリンカが 中間 manifest(xml) と .rc を生成する
- リソースコンパイラが .rc をビルドして .res にする
- リンカが 中間manifest.res を .exe に埋め込む
- マニフェストツール(mt.exe) が .exe に埋め込まれた manifest と 外部 manifest を結合して、 埋め込み manifest を更新する
2で生成される 中間ファイル を MinGW ビルドで使えるようにバックアップしておけば、 とりあえず 同じ manifest を使う環境を用意できるのかな、と思っています。
これなんかせにゃいかんですね。
processorArchitecture="*"
にしておけばいいような気がしますが。
それ以前に、MinGWビルドにはマニュフェストファイルが埋め込まれていないっていう問題がありまして・・・。
あれ、MSVCだとこのファイルとは関係なくリンカでmanifestを埋め込むようになっているのか。
そうなると、ヘルプの sakura.exe.manifest
関連の記載はもう無効なのかな?
https://github.com/sakura-editor/sakura/blob/17bcab72eac7647cd8b7424db92aa4f87b9aff97/help/sakura/res/HLP000005.html#L24-L31
https://github.com/sakura-editor/sakura/blob/17bcab72eac7647cd8b7424db92aa4f87b9aff97/help/sakura/res/HLP000080.html#L18-L20
そうなると、ヘルプの
sakura.exe.manifest
関連の記載はもう無効なのかな?
少なくとも MSVC 版では無効ですね。
というか、ヘルプの説明が誤解を招く表現になってますね。 ※Virtual Store は windows の機能なので manifest 置いたくらいじゃ無効化できないっす。
怪) Vista以降のUACに対応していないバージョン(1.5.17.0以前)からバージョンアップする場合は、manifestを置くことで Virtual Store が無効化されるため、これまで使っていた設定が引き継がれません。 必要に応じて sakura.ini を適切な位置へ移動するなどの対応をお願いします。
正) Vista以降の 64bit OS で UACに対応してないバージョンから UACに対応したバージョン にバージョンアップする場合、manifest を置くことで 管理者権限 で起動できるようになります。管理者権限で起動した場合、UAC によるパスリダイレクト(Virtual Path) は行われないため、これまで使っていた設定が引き継がれません。必要に応じて sakura.ini を適切な位置へ移動するなどの対応をお願いします。
ふと思ったんですが、現代人にこの説明は要るんですかね・・・。
個人的には動作に支障が無ければ今のまま(変えない)でも良いんじゃないかなと思います。
https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests#assemblyidentity をみると optional という事なので削ってしまって簡単に動作確認して問題が無さそうならそれでも良いんじゃないかと。
というか今はプロジェクトのプロパティの Manifest Tool で設定するからこのファイルは x86/x64 ビルドでは使われていないのかな。。それならあまり気にする必要が無いような。。