次の方法で共有


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

重要

Visual Studio 2017 以降では、アプリを Arm64 または Arm64EC に再コンパイルして、アプリが完全なネイティブ速度で実行されるようにすることができます。 Arm64 としてのコンパイルの詳細については、ブログ投稿「 Arm 開発での Windows 10 の非公式サポート」を参照してください。 Arm64EC の詳細については、「 Arm64EC の概要: Arm での Windows 11 用のネイティブおよび相互運用可能なアプリの構築を参照してください。

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

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

WOW のベスト プラクティス

一般的な問題の 1 つは、アプリが WOW で実行されていることを検出し、それが x64 システム上にあることを前提としたときに発生します。 この想定を行った後、アプリは次のことを行う可能性があります。

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

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

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

ドライバー

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

シェル拡張

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

デバッグ

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

Virtual Machines

Windows ハイパーバイザー プラットフォームは、Qualcomm Snapdragon 835 Mobile PC プラットフォームではサポートされていません。 そのため、Hyper-V を使用して仮想マシンを実行することはできません。 今後のクアルコムチップセットに対して、これらの技術への投資を続けています。

動的コード生成

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

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