11

32 ビットのハードウェア / OS 用に作成されたプログラムが 64 ビットのハードウェア / OS で実行されない根本的な理由がないことは理解していますが、実際には、32 ビット バージョンの Windows を対象とした多くのプログラムが実行されないことがわかりました。 Windows の 64 ビット バージョンで動作します。例としては、多くの人気のあるセキュリティ ユーティリティ (Norton および Check Point の Zone Alarm のほとんどの製品) やいくつかのゲーム (ここ数週間、Grand Theft Auto 4 を実行しようと試みていますが、うまくいきませんでした。これは、GTA4 に関連する他の多くの問題に関連している可能性がありますが、ここでもそこでもありません)。

プログラムの非互換性は、「Program Files (x86)」フォルダから実行したくないという単純な理由で発生する可能性があると聞きましたが、他の理由にはどのようなものがありますか? 32 ビット システム用に作成されたウイルス スキャナまたはファイアウォールが 64 ビット システムで実行されないのはなぜですか? すべてが理論的に下位互換性があるのに、なぜゲームが実行されないのでしょうか?

4

8 に答える 8

7

このスレッドには多くの誤った情報があります。

32 ビット アプリケーションが 64 ビット Windows で実行されている場合:

  • 互換性の問題のほとんどは、アプリケーションがカーネル モード ドライバーをインストールしようとしたときに発生します。64 ビット OS に 32 ビット ドライバーをインストールすることはできません。これは、ほぼ間違いなくファイアウォールの問題です。TCP/IP ドライバー スタックにフックしようとしています。
  • エミュレーターはありません!32 ビットのオブジェクト コードは、CPU によって完全にネイティブにフル スピードで実行されます。
  • 古い 16 ビット コードはサポートされていません。これにより、多くのインストーラーが壊れました。
  • 通常、適切なフォルダにアクセスすることは問題ではありません。32 ビット プログラムがたとえば %windir%\system32\ でファイルを開くと、OS は自動的にそのファイルを %windir%\syswow64 にリダイレクトします。レジストリの特定の部分についても同じです。ここには潜在的な落とし穴がいくつかありますが、それらは一般的に、さまざまな WINAPI Get...Directory() 関数が Windows 95 で行ったのと同じ文字列を返すと仮定することに沿っています。
  • コンパイルされたのが 10 年前であろうと昨日だけであろうと、C/C++ ポインターは依然として 32 ビット (4 バイト) であり、それを想定したすべてのコード (SendMessage() を含む) です。-- まだ動作します。8 バイト ポインターの問題は、64 ビット コンパイラーへの変換を開始するまで発生しません。
于 2008-12-27T16:00:05.510 に答える
4

私が見つけた最良の説明は、基本的に32ビットプログラムが64ビット環境で実行されるネイティブプログラムから得られるシステムアクセスを許可しないエミュレーションのレイヤーで実行されることを示しています。

http://blogs.msdn.com/oldnewthing/archive/2008/12/22/9244582.aspx

これは、GTA4 のようなプログラムの問題が、32 ビット ネイティブ システムで見られる期待される結果を生成しないエミュレーション レイヤーに起因することを意味すると思います。これが、Microsoft リリースの互換性の更新が常に表示され続ける理由です。

この問題について MSDN は次のように述べています。

http://msdn.microsoft.com/en-us/library/bb427430(VS.85).aspx

于 2008-12-27T01:10:28.053 に答える
3

ドライバーは、プログラムとは別の話です: http://support.microsoft.com/kb/896456

Zone Alarm は、Check Point が作成した特別な 32 ビット ドライバを使用して監視を行います。これがおそらく、そのアプリケーションで問題を引き起こしている原因です。グランド・セフト・オート4は?何も思いつきません。

于 2008-12-27T01:07:15.953 に答える
2

理由はいくらでもあります。

低レベルでプログラムされているアプリケーションは、32 ビット レジスタを想定している可能性があります。novatrust によって投稿された Zone Alarm ドライバーが良い例です。GTA4 はアセンブリを使用していくつかのポイントでパフォーマンスを改善している可能性があり、その結果、C++ で 32 ビットを想定しているだけでなく、何かが発生する可能性があります。たとえば、次のコードを見てください。

struct GPoint
{
  int x;
  int y;
}

// Array of twenty GPoints
GPoint[] myArr = malloc(20 * sizeof(GPoint);

GPoint* myPointer = myArr;
int index = GetIndexAffectedPoint();

// Invert X and Y for the point
myPointer += 8*index;
swap(myPointer);

例がかなり素朴であることは知っていますが、とにかく、そのコードでは、構造体は8バイトの長さ(x整数の4バイトとy整数の4バイト)であると想定していますが、64ビットシステムでは実際にはその2倍の長さですそのため、間違ったポイントを交換することになります...そのようなことは、特にパフォーマンスを向上させようとするときに、低レベル言語でよく起こります...

于 2008-12-27T01:17:15.807 に答える
1

32 ビットから 64 ビットへの移行に関する考慮事項

編集代替リンク

于 2008-12-27T22:48:59.710 に答える
0

ファイル システムまたはレジストリを使用している場合は、正しいフォルダにアクセスしていることを確認してください。x86 プログラムとして、x64 フォルダーではなく、「Program Files (x86)」、「SysWOW64」、「WOW6232Node」などのフォルダーにアクセスしたいと思うでしょう。

Norton や Check Point の Zone Alarm などの x86 アプリケーションを搭載した製品は、x86 ドライバーを実行できません。これは、ドライバーがオペレーティング システムで実行できるようにx64 にする必要があるためです。

于 2008-12-27T01:03:27.253 に答える