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

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

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

Ответы [ 8 ]

7 голосов
/ 27 декабря 2008

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

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

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

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

3 голосов
/ 27 декабря 2008

Драйверы это разные истории, которые программируют: http://support.microsoft.com/kb/896456

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

2 голосов
/ 27 декабря 2008

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

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

1 голос
/ 14 июня 2009

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

1 голос
/ 14 июня 2009

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

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

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

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

1 голос
/ 28 декабря 2008
0 голосов
/ 27 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...