スキップしてメイン コンテンツへ

 none
特定の操作を行うと、外部マニフェストファイルを読み込まなくなる RRS feed

  • 質問

  • お世話になっています。

    「外部マニフェストファイルを読み込むexe」で、同階層に外部マニフェストが無い状態で実行すると
    それ以降外部マニフェストを読み込まなくなってしまいます。
    原因や回避策を教えて頂けないでしょうか。

    ●環境
    Windows10pro バージョン1809(17763.805)
    VisualStudio2017(Version 15.9.11)
    WindowsSDKバージョン 10.0.17763.0

    ●構成
    MFC ダイアログベースのexe
    プログラムは変更しておらず、デフォルトの状態。

    ●プロジェクトの設定(exeの名前はOutManifestLoad2)
    ・リンカー/マニフェストファイル/マニフェストの生成
     いいえ(/MANIFEST:NO)
    ・マニフェストツール/入出力/追加のマニフェストファイル
     -manifest OutManifestLoad2.exe.manifest
    ・マニフェストツール/入出力/埋め込みマニフェスト
     いいえ
    ・上記以外はすべてデフォルト

    ●外部マニフェストファイル(OutManifestLoad2.exe.manifest)

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
            <security>
                <requestedPrivileges>
                    <requestedExecutionLevel level="asInvoker" uiAccess="false">
                    </requestedExecutionLevel>
                </requestedPrivileges>
            </security>
        </trustInfo>
        <application xmlns="urn:schemas-microsoft-com:asm.v3">
            <windowsSettings>
                <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
            </windowsSettings>
        </application>
    </assembly>
    

    ●構成
    Dir
    ┣OutManifestLoad2.exe
    ┗OutManifestLoad2.exe.manifest

    ●再現手順
    1. モニターのDPIを150%以上にし、サインアウトする。
    2. OutManifestLoad2.exeを実行する。
     →dpiAwareがtrueなので、ダイアログが鮮明に表示される
    3. マニフェストのdpiAwareがfalseに書き換え、OutManifestLoad2.exeを実行する。
     →dpiAwareがfalseなので、ダイアログがぼやけて表示される
    -----(ここまで正常な動作の確認)-----)
    4. マニフェストのdpiAwareをtrueに戻し、マニフェストをリネームする(___OutManifestLoad2.exe.manifest等)。その後OutManifestLoad2.exeを実行する。
     →マニフェストファイルが無いので、ダイアログがぼやけて表示される。
    5. マニフェストのファイル名を元に戻す(OutManifestLoad2.exe.manifest)。その後OutManifestLoad2.exeを実行する。
     →マニフェストがあり、dpiAwareがtrueなのに、ダイアログがぼやけて表示される(現象再現!)

    ●回避策?
    ①実行するパスを変更すると、現象が発生しなくなります。
    DirをDir2にリネームすると、同じexe、同じマニフェストなのに、正しくマニフェストを読み込んだ動作になります。

    ②OutManifestLoad2.exeを更新すると、現象が発生しなくなります。
    OutManifestLoad2.exeをバイナリエディタで開き、1byte書き換え保存、書き換えを元に戻し保存すると、正しくマニフェストを読み込んだ動作になります。

    よろしくお願いします。

    2019年11月1日 1:14

すべての返信

  • Hi mnbfmt

    問題をうまく再現できませんでした。

    何かを見逃しているかどうかはわかりませんので、スナップショットを通して一連の操作を示しました。

    私の環境

    Windows10pro バージョン1903
    VisualStudio2017
    WindowsSDKバージョン 10.0.17763.0

    ディスプレイDPI:150%

    dpiAware = trueの場合、画像は次のようになります

    dpiAware = falseの場合、画像は次のようになります

    2つの写真に違いはないことがわかるので、何か見逃した場合はお知らせください。

    Best regards,

    Strive


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年11月5日 7:22
  • Strive Sun-MSFTさん

    再現確認をしていただいてありがとうございます!

    2枚目の一番上の項目が、フルパスになっていますが、以下を設定して頂けますか。

    ・マニフェストツール/入出力/追加のマニフェストファイル

     -manifest OutManifestLoad2.exe.manifest

    ここを変更しても、今だ再現しない場合連絡ください。
    私のプロジェクトの設定をすべて画像でアップロードします。

    よろしくお願いします。

    2019年11月5日 14:20
  • ドキュメントで裏取りはしていませんが、過去の質問のやりとりをした印象では、以下の動きをしているはずです。

    「exe ファイルおよび manifest ファイルの更新日時をチェックし、新しくなっていなければ Windows でキャッシュした情報を使う」

    おそらく、manifest ファイルがないという情報がキャッシュされている場合は、exe ファイルの更新日時が新しくなっているかどうかだけがチェック対象になるのではないでしょうか?

    予想の積み重ねで申し訳ないですが、この動きはおそらく Windows に意図的に作り込まれていると思われます。
    よって、以下のいずれかになりそうです。

    1. そういった使い方は諦めていただく
    2. exe の更新日時を変えるようなツールを併用していただく
    3. ファイルのプロパティタブの互換性の DPI に関する設定で代用していただく

    追記
    この blog において、サイドバイサイドの仕組みとしてキャッシュする…ということが示唆されているような…?

    2019年11月5日 21:11
    モデレータ
  • mnbfcmtさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。
    Strive Sun-MSFTの代わりに返信させていただきます。

    はい、まだ再現できません。詳細を以下に示します。
    •OutManifestLoad2.exe.manifestファイルはデバッグファイルディレクトリに配置されていますか、それとも以下に示す場所に配置されていますか。

    •dpiAwareの値を変更するとき(trueまたはfalse)、exe実行可能ファイルを再コンパイルする必要がありますか。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月6日 8:07
    モデレータ

  • Azuleanさんありがとうございます。
    Azuleanさんの仰るように、どこかにキャッシュしており、exeが更新されるとキャッシュクリアされているようですね。
    ちゃんとしたドキュメントがあれば説明しやすくて助かりますが、その可能性は低そうですね。
    ひとまず運用で回避できそうな流れになりました。


    Harukaさん。
    Strive Sun-MSFTさんの代わりに再現確認して頂き、ありがとうございます。

    >•dpiAwareの値を変更するとき(trueまたはfalse)、exe実行可能ファイルを再コンパイルする必要がありますか。
    マニフェストファイルのdpiAwareを変更しても、exeの再コンパイルは不要です。

    >•OutManifestLoad2.exe.manifestファイルはデバッグファイルディレクトリに配置されていますか、それとも以下に示す場所に配置されていますか。
    マニフェストファイルは以下のように、exeと同じ階層においています。
    このマニフェストは実行時にあればよく、ビルド時には無くてもよいです。

    ●構成
    Dir
    ┣OutManifestLoad2.exe
    ┗OutManifestLoad2.exe.manifest


    私が勘違いしていることがありました。
    以下の項目は設定不要です。これはビルド時にexeに組み込むマニフェストを設定する項目ですよね。
    「埋め込みマニフェスト:いいえ」にしているので、ここに何を設定しても意味はないはずです。(もちろん設定していれも再現はします)
    誤った情報を書き込んで、混乱させてしまい申し訳ありませんでした。
    ・マニフェストツール/入出力/追加のマニフェストファイル
     -manifest OutManifestLoad2.exe.manifest

    2019年11月6日 13:51