Обеспечение программы, написанной для 32-разрядной Windows, совместимо с 64-разрядной версией Windows

Хотя я понимаю, что нет основополагающей причины, что программа, написанная для 32-разрядных аппаратных/ОС, не должна запускаться на 64-битном оборудовании/ОС, на практике я нашел много программ, предназначенных для 32-разрядных версий Windows что не будет работать в 64-разрядных версиях Windows. Примеры включают ряд популярных утилит безопасности (большинство продуктов от Norton и Check Point Zone Alarm) и несколько игр (я пытался получить Grand Theft Auto 4 для запуска в течение нескольких недель, но безрезультатно - конечно, это может быть связано с любым количеством других проблем, связанных с GTA4, но ни здесь, ни там).

Я слышал, что несовместимость программы может возникнуть из-за чего-то такого простого, что вы не хотите запускать из папки "Program Files (x86)", но каковы некоторые другие причины? Почему антивирусный сканер или брандмауэр, написанный для 32-разрядной системы, не запускается в 64-битной системе? Почему игра не запускается, когда все теоретически обратно совместимо?

Ответ 1

Здесь представлено лучшее объяснение, которое в основном говорит о том, что 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

Ответ 2

В этой теме много дезинформации.

Когда 32-разрядное приложение запускается в 64-битных окнах:

  • Большинство проблем совместимости возникают, когда приложение пытается установить драйвер режима ядра. 32-разрядный драйвер не может быть установлен в 64-разрядной ОС. Это, безусловно, проблема с брандмауэром. Он пытается подключиться к стеку драйверов TCP/IP.
  • НЕТ ЭМУЛЯТОРА! 32-битный объектный код выполняется процессором полностью на полной скорости.
  • Поддержка старого 16-битного кода не поддерживается. Это сломало множество инсталляторов.
  • Доступ к правильным папкам обычно не является проблемой. Когда 32-разрядная программа открывает файл, скажем,% windir%\system32 \, ОС автоматически перенаправляет его на% windir%\syswow64. То же самое для некоторых частей реестра. Здесь есть несколько потенциальных ошибок, но они, как правило, предполагают, что различные функции WINAPI Get... Directory() возвращают те же строки, что и в Windows 95.
  • Было ли это скомпилировано 10 лет назад или только вчера, тогда указатели C/С++ по-прежнему 32-битные (4 байта) и весь код, который только что предположил, что, включая SendMessage()! -- до сих пор работает. Проблема с 8-байтовым указателем не входит в изображение до тех пор, пока вы не начнете конвертировать в 64-битные компиляторы.

Ответ 3

Драйверы - это другая история о том, что программы: http://support.microsoft.com/kb/896456

Zone Alarm использует специальный 32-разрядный драйвер, созданный Check Point для мониторинга. Вероятно, это то, что создает проблему с этим приложением. Что касается Grand Theft Auto 4? Я понятия не имею.

Ответ 4

Может быть любое количество причин.

Любое приложение, запрограммированное на низком уровне, может ожидать 32-битный регистр. Хорошим примером является аварийный драйвер зоны, отправленный novatrust. GTA4 может использовать сборку для повышения производительности в нескольких точках, что может привести к чему угодно или даже просто предположить 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 байтов (4 байта целого числа x и 4 байта для y-целого), но в 64-битной системе на самом деле в два раза больше, поэтому вы в конечном итоге замените неправильную точку... такие вещи случаются много на языках низкого уровня, особенно при попытке повысить производительность...

Ответ 6

Приложения безопасности - плохой пример. Все они выполняют неподтвержденные вещи против недокументированных вещей. Изменения между одной 32-разрядной версией Windows для следующего достаточно, чтобы разбить их, не переходя к 64-разрядной версии.

Тем не менее, есть некоторые совместимые прокладки, которые исправляют ваш код на 32-разрядном, который не будет, когда приложение 64-разрядное. Это связано с тем, что Microsoft предполагает, что вы протестировали его на 64-разрядной версии.

Один полученный результат имеет .NET-приложения. При работе в 32-разрядной системе exe имеет jitted до 32 бит, где есть совместимость прокладки, чтобы исправить ваши ошибки. Если ваш клиент работает в 64-разрядной системе, исполняемый файл будет разделен на 64 бита, где эти совместимые прокладки, защищенные вами от вас, будут больше не.

У Chris Jackson была хорошая запись в блоге об этом: Удаление приложений на 64-битной Windows Vista

Ответ 7

Проблема, вероятно, в драйверах. С играми это, вероятно, какая-то слизистая схема DRM. Попытайтесь получить трещины без CD для игры, чтобы вы могли запускать ее без DRM.

Ответ 8

Если вы используете файловую систему или реестр, убедитесь, что доступ к правильным папкам. В качестве x86-программы вы, вероятно, захотите получить доступ к "Программным файлам (x86)", "SysWOW64", "WOW6232Node" и таким папкам вместо x64.

Продукты с приложениями x86, такими как Norton и Check Point Zone Alarm, не могут запускать драйвер x86, так как драйверу требуется x64, чтобы он мог работать под управлением операционной системы.