sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.23k stars 162 forks source link

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

Open m-tmatma opened 6 years ago

m-tmatma commented 6 years ago

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

berryzplus commented 6 years ago

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

m-tmatma commented 6 years ago

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

berryzplus commented 6 years ago

ただ 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 commented 4 years ago

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

k-takata commented 4 years ago

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

berryzplus commented 4 years ago

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

k-takata commented 4 years ago

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

berryzplus commented 4 years ago

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

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

beru commented 3 years ago

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

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

beru commented 3 years ago

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