跳到主要內容

 none
windows7 api-ms-win-shcore-scaling-1-1-1.dllがない RRS feed

  • 問題

  • Visual Studio 2017で開発したアプリケーションをWindows7で実行すると、

    api-ms-win-shcore-scaling-1-1-1.dllがないと警告が表示されてプログラムが起動しない。

    OS:Windows7 SP1

    Microsoft Visual C++ 2015-2019 Redistibutable(x86)-14.22.27821 はインストール済


    2019年7月30日 上午 12:15

解答

  • この中で Minimum supported client に Windows 8.1 からと書かれているので、使う際にきちんとドキュメントを読むことで回避することができるわけです。
    今回の例に限らず、新しいものを試される際は「どこから使えるのか?」を調べることを癖づけていただいた方が安全です。

    技術的にはjzkeyさんが「プロジェクトのWIN32_WINNTが不適切」と触れられています。

    WINVER および _WIN32_WINNT の変更で説明されていますが、例えば製品の動作環境をWindows 7以降と定めるのであれば

    #define _WIN32_WINNT _WIN32_WINNT_WIN7

    を先頭に指定すべきです。この指定がなされている場合、GetDpiForMonitor()などWindows 7で提供されていない関数はプリプロセッサにより除去されるため、コンパイルエラーとして摘出することができます。
    Windows 7 SP1追加関数はどうなるか、など厳密ではない部分もありますが、ある程度の指針になります。

    2019年7月31日 下午 02:15
  • サポートが2020年1月に切れるといえ、OSによって使えないAPIがあるとベンダーは対応が大変です。

    新しい OS、新しい SDK で関数が増えることは、機能拡張・改良と OS や SDK が進化している以上は正常な姿です。
    どちらかと言えば、その API を使うと決めた際の調査不足だと考えられます。
    (Windows に限った話ではない。Android であれ、iOS であれ、特定のバージョンから使えるというものは存在します)

    例に挙がっている、GetDpiForMonitor を検索すると以下のドキュメントが確認できます。
    https://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getdpiformonitor

    この中で Minimum supported client に Windows 8.1 からと書かれているので、使う際にきちんとドキュメントを読むことで回避することができるわけです。
    今回の例に限らず、新しいものを試される際は「どこから使えるのか?」を調べることを癖づけていただいた方が安全です。

    2019年7月31日 下午 01:22
    版主

所有回覆

  • https://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getdpiformonitor
    こういう(Win8.1から実装されたような)APIを呼んでいるからでは?
    Windows7を対象にしてるなら、LoadLibrary/GetProcAddres経由で呼んで、かつ、フォールバックを実装する必要がるでしょう。
    リンクできてしまうのは、プロジェクトのWIN32_WINNTが不適切な気もします。

    jzkey


    • 已編輯 jzkey 2019年7月31日 上午 02:01 改行
    • 已提議為解答 佐祐理 2019年8月3日 上午 04:58
    2019年7月31日 上午 01:57
  • jzkeyさん

    参考になりました。

    私たちのアプリケーションは、高DPI対応で、GetDpiForMonitorを使用していました。

    サポートが2020年1月に切れるといえ、OSによって使えないAPIがあるとベンダーは対応が大変です。

    2019年7月31日 上午 06:58
  • サポートが2020年1月に切れるといえ、OSによって使えないAPIがあるとベンダーは対応が大変です。

    新しい OS、新しい SDK で関数が増えることは、機能拡張・改良と OS や SDK が進化している以上は正常な姿です。
    どちらかと言えば、その API を使うと決めた際の調査不足だと考えられます。
    (Windows に限った話ではない。Android であれ、iOS であれ、特定のバージョンから使えるというものは存在します)

    例に挙がっている、GetDpiForMonitor を検索すると以下のドキュメントが確認できます。
    https://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getdpiformonitor

    この中で Minimum supported client に Windows 8.1 からと書かれているので、使う際にきちんとドキュメントを読むことで回避することができるわけです。
    今回の例に限らず、新しいものを試される際は「どこから使えるのか?」を調べることを癖づけていただいた方が安全です。

    2019年7月31日 下午 01:22
    版主
  • この中で Minimum supported client に Windows 8.1 からと書かれているので、使う際にきちんとドキュメントを読むことで回避することができるわけです。
    今回の例に限らず、新しいものを試される際は「どこから使えるのか?」を調べることを癖づけていただいた方が安全です。

    技術的にはjzkeyさんが「プロジェクトのWIN32_WINNTが不適切」と触れられています。

    WINVER および _WIN32_WINNT の変更で説明されていますが、例えば製品の動作環境をWindows 7以降と定めるのであれば

    #define _WIN32_WINNT _WIN32_WINNT_WIN7

    を先頭に指定すべきです。この指定がなされている場合、GetDpiForMonitor()などWindows 7で提供されていない関数はプリプロセッサにより除去されるため、コンパイルエラーとして摘出することができます。
    Windows 7 SP1追加関数はどうなるか、など厳密ではない部分もありますが、ある程度の指針になります。

    2019年7月31日 下午 02:15
  • miyanagaさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    佐祐理さんから寄せられた投稿はお役に立ちましたか。

    参考になった回答には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。


    MSDN/ TechNet Community Support Haruka

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

    2019年8月2日 上午 08:24
    版主