sakura icon indicating copy to clipboard operation
sakura copied to clipboard

manifest ファイルの processorArchitecture が x86 になっている

Open m-tmatma opened this issue 6 years ago • 10 comments

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

m-tmatma avatar Jun 08 '18 23:06 m-tmatma

それは何かの事情で 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 対応するなら手を考えないといけないトピックだと思っています。

berryzplus avatar Jun 09 '18 00:06 berryzplus

埋め込まれたマニフェストを確認するには 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

m-tmatma avatar Jun 09 '18 07:06 m-tmatma

ただ 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 関連の動きは以下のような感じです。

  1. cppに記述した pragma がリンカに渡される
  2. 渡されたコマンドとオプションを元にリンカが 中間 manifest(xml) と .rc を生成する
  3. リソースコンパイラが .rc をビルドして .res にする
  4. リンカが 中間manifest.res を .exe に埋め込む
  5. マニフェストツール(mt.exe) が .exe に埋め込まれた manifest と 外部 manifest を結合して、  埋め込み manifest を更新する

2で生成される 中間ファイル を MinGW ビルドで使えるようにバックアップしておけば、 とりあえず 同じ manifest を使う環境を用意できるのかな、と思っています。

berryzplus avatar Jun 10 '18 11:06 berryzplus

これなんかせにゃいかんですね。

berryzplus avatar Sep 10 '20 15:09 berryzplus

processorArchitecture="*" にしておけばいいような気がしますが。

k-takata avatar Sep 10 '20 15:09 k-takata

それ以前に、MinGWビルドにはマニュフェストファイルが埋め込まれていないっていう問題がありまして・・・。

berryzplus avatar Sep 10 '20 17:09 berryzplus

あれ、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

k-takata avatar Sep 11 '20 02:09 k-takata

そうなると、ヘルプの 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 を適切な位置へ移動するなどの対応をお願いします。

ふと思ったんですが、現代人にこの説明は要るんですかね・・・。

berryzplus avatar Sep 11 '20 18:09 berryzplus

個人的には動作に支障が無ければ今のまま(変えない)でも良いんじゃないかなと思います。

https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests#assemblyidentity をみると optional という事なので削ってしまって簡単に動作確認して問題が無さそうならそれでも良いんじゃないかと。

beru avatar Feb 27 '21 13:02 beru

というか今はプロジェクトのプロパティの Manifest Tool で設定するからこのファイルは x86/x64 ビルドでは使われていないのかな。。それならあまり気にする必要が無いような。。

beru avatar Feb 27 '21 13:02 beru