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

StackOverflow https://stackoverflow.com/questions/394521

Вопрос

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

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

Это было полезно?

Решение

Лучшее объяснение, которое я нашел, предлагается здесь, в котором в основном говорится, что 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.То же самое для некоторых частей реестра.Здесь есть несколько потенциальных ошибок, но они, как правило, сводятся к предположению, что различные функции WINAPI Get...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);

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top