Обеспечение программы, написанной для 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-битной системе на самом деле в два раза больше, поэтому вы в конечном итоге замените неправильную точку... такие вещи случаются много на языках низкого уровня, особенно при попытке повысить производительность...
Ответ 5
От 32-битных до 64-битных соображений по миграции
EDIT: Альтернативная ссылка
Ответ 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, чтобы он мог работать под управлением операционной системы.