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

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

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

8 ответов


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


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

при запуске 32-разрядного приложения в 64-разрядной системе windows:

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

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

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


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

любое приложение, которое запрограммировано на низкий уровень, может ожидать 32-битный регистр. Хорошим примером является драйвер Zone Alarm, размещенный novatrust. GTA4 может использовать сборку для повышения производительности в нескольких точках, что может привести к чему угодно или даже просто предположить 32 бита на C++. Например, возьмите следующий код:

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);

Я знаю, что пример довольно наивен, но в любом случае, в этом коде вы предполагаете вы struct имеет длину 8 байт (4 байта X integer и 4 байта для y integer), но в 64-битной системе на самом деле вдвое длиннее, поэтому вы в конечном итоге замените неправильную точку... подобные вещи часто происходят на языках низкого уровня, особенно при попытке повысить производительность...


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

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

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

У Криса Джексона была хорошая запись в блоге об этом: Shimming применения дальше Windows Vista 64-Бит


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



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

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