x86 デスクトップ アプリのトラブルシューティング

重要

Visual Studio 2017 以降では、アプリを Arm64 または Arm64EC に再コンパイルして、アプリが完全なネイティブ速度で実行されるようにすることができます。 Arm64 としてのコンパイルの詳細については、ブログ投稿「Arm 開発に関するWindows 10の公式サポート」を参照してください。 Arm64EC の詳細については、「Announcing Arm64EC: Building Native and Interoperable Apps for Windows 11 on Arm」を参照してください。

x86 デスクトップ アプリが x86 コンピューターで実行したときのように動作しない場合、トラブルシューティングに役立つガイダンスを次に示します。

問題 解決策
アプリは、Arm 用に設計されていないドライバーに依存しています。 x86 ドライバーを Arm64 に再コンパイルします。 WDK を使用した Arm64 ドライバーのビルドに関するページを参照してください。
アプリが x64 でしか使用できない。 Microsoft Store 用に開発する場合は、Arm バージョンのアプリを送信します。 詳しくは、「アプリ パッケージのアーキテクチャ」をご覧ください。 Win32 開発者の場合は、アプリを Arm64 に再コンパイルすることをお勧めします。 詳細については、「Arm 開発でのWindows 10の Visual Studio サポートの早期プレビュー」を参照してください。
アプリで OpenGL バージョン 1.1 以降が使用されているか、ハードウェア アクセラレータによる OpenGL を必要としている。 利用可能な場合は、アプリの DirectX モードを使用します。 DirectX 9、DirectX 10、DirectX 11、DirectX 12 を使用する x86 アプリは、Arm で動作します。 詳しくは、「DirectX のグラフィックスとゲーミング」をご覧ください。
x86 アプリが期待どおりに動作しない。 Arm のプログラム互換性トラブルシューティング ツールのガイダンスに従って 、互換性のトラブルシューティング ツールを使用してみてください。 その他のトラブルシューティング手順については、 Arm での x86 アプリのトラブルシューティングに関する記事を 参照してください。

WOW のベスト プラクティス

アプリが WOW で実行されていることを検出するとある一般的な問題が発生し、x64 システムにあると想定します。 この想定に基づいて、アプリは次の操作を行う可能性があります。

  • Arm ではサポートされていない x64 バージョンのそれ自体をインストールしてみてください。
  • ネイティブ レジストリ ビューでその他のソフトウェアをチェックします。
  • 64 ビット .NET Framework が利用できると想定します。

一般に、アプリは WOW で実行されていると判断された場合、ホスト システムに関する想定を行いません。 可能な限り OS のネイティブ コンポーネントを操作しないようにしてください。

アプリは、ネイティブ レジストリ ビューにレジストリ キーを配置したり、WOW の存在に基づいて機能を実行したりする可能性があります。 元の IsWow64Process は、アプリが x64 コンピューターで実行されているかどうかのみを示しています。 アプリは IsWow64Process2 を使って、WOW をサポートするシステムで実行されているかどうかを判断するようになりました。

ドライバー

すべてのカーネル モード ドライバー、ユーザー モード ドライバー フレームワーク (UMDF) ドライバー、印刷ドライバーが OS のアーキテクチャと一致するようにコンパイルする必要があります。 x86 アプリにドライバーがある場合は、そのドライバーを Arm64 用に再コンパイルする必要があります。 ただし、エミュレーションでは x86 アプリが正常に実行される場合がありますが、そのドライバーは Arm64 用に再コンパイルする必要があり、ドライバーに依存するすべてのアプリ エクスペリエンスは使用できません。 Arm64 用ドライバーのコンパイルの詳細については、「WDK を使用した Arm64 ドライバーのビルド」を参照してください。

シェル拡張

Windows コンポーネントをフックしたり、DLL を Windows プロセスに読み込んだりしようとするアプリは、システムのアーキテクチャに合わせて DLL を再コンパイルする必要があります。つまり、Arm64 です。 通常、これらは入力方式エディター (IME)、支援技術、シェル拡張アプリによって使用されます (例: エクスプローラーや右クリックのコンテキスト メニューでのクラウド記憶域アイコンの表示など)。 アプリまたは DLL を Arm64 に再コンパイルする方法については、Arm 開発に関する Visual Studio サポートの早期プレビューのWindows 10に関するブログ投稿を参照してください。

デバッグ

アプリの動作をさらに詳しく調べるには、「 Arm でのデバッグ 」を参照して、Arm でのデバッグのツールと戦略の詳細を確認してください。

Virtual Machines

Windows ハイパーバイザー プラットフォームは、Qualcomm の Snapdragon 835 モバイル PC プラットフォームでサポートされていません。 したがって、Hyper-V を使った仮想マシンの実行は機能しません。 将来の Qualcomm チップセットでは、これらのテクノロジへの投資が続けられます。

動的コード生成

X86 デスクトップ アプリは、実行時に Arm64 命令を生成するシステムによって Arm64 でエミュレートされます。 つまり、x86 デスクトップ アプリがそのプロセスで動的なコードの生成や変更を妨げる場合、そのアプリを Arm64 で x86 として実行することはできません。

これは、一部のアプリがそのプロセスで ProcessDynamicCodePolicy フラグを指定した SetProcessMitigationPolicy API を使用して有効にするセキュリティ軽減策です。 x86 プロセスとして Arm64 で正常に実行するには、この軽減ポリシーを無効にする必要があります。