Мой настольный компьютер поставляется с Windows 7 Home Premium 64-бит, поскольку он имеет 4 ГБ оперативной памяти.Компьютер используется только для тестирования программного обеспечения и я делаю с ним всякие сумасшедшие вещи, такие как запуск вредоносных файлов, вирусов и т.д.Это слишком опасно для некоторых противовирусных программ потому что я знаю, имеющийся у меня инструмент blackhat, может внести вредоносный файл,который выглядит так, как если бы он безопасный.
Проблемы с 64-битной Windows 7 является несовместимость с некоторым программным обеспечение,особенно,безопасности приложений.Я скачал Windows 7 32-ISO и создал подлинный ключ продукта для активации от моего Technet счета,но мне ужасно надоело, внезапное отключение Windows 7 и я не мог снова включить его,даже если ключ является законным.Что я хочу сделать,это каким-то образом конвертировать мою существующую Windows 7 OEM 64-разрядные версию на 32-битную, но, к сожалению, это просто не возможно,из-за самой операционной системы.Однако, есть технологии работы понижения с 64-разрядной версии Windows 7 на 32-битную и довольно не плохо получается,но этот процесс может быть немного долгим.
Во-первых, вам необходимо либо скачать точно такую же версию Windows 7 ISO или просто удалите ei.cfg, чтобы создать универсальное издание диск селектор Windows 7 . К счастью, у нас есть то,что охватывает и вы можете посетить статьи для загрузки Windows 7 Service Pack 1, ISO образы непосредственно от Microsoft, официального дистрибьютора Digital River. Пока ябуду описывать понижение Windows 7 для 32 в этой статье, вы можете так же легко пойти по другому пути и перейти от 32-битной к 64-битной если у вас есть 4 ГБ или больше памяти, просто убедитесь,что Вы выбрали для загрузки правильной 64-ISO-образ. Если у вас меньше, чем 4 ГБ памяти,я бы порекомендовал оставаться с 32bit версией.
Прежде чем пытаться переустановить ,очевидно, что вам необходимо сделать резервную копию всех важных данных,. Лучше, если вы сможете создать полное резервное копирование вашего диска,так что вы сможете восстановить его обратно,если что-нибудь пойдёт не так. Затем резервную копию существующей Windows 7 лицензия Вы можете записать на USB флэш-накопитель.Переустановить Windows 7 32-bit и восстановить OEM лицензию.
Стоит отметить следующий метод,который работает для OEM активированных систем и не устанавливает активирование через телефон или Интернет. OEM я имею в виду таких производителей, как Dell, HP, Asus и др. Для другого способа,нужно сделать резервную копию вашей активации в том числе по телефону и он-лайн типов,читайте статью о программе под названием Advanced Маркеры Менеджер.
Ранее я написал о ABR (Активация Резервного копирования и Восстановления) , который является возможностью резервного копирования и восстановления активации от Windows Vista и есть бета-версия, которая работает с Windows 7. Я лично проверил этот метод, и он прекрасно работает.Важное правило – нужно обязательно убедиться, что вы восстанавливаете Windows 7 OEM с активированной лицензией на ту же версию Windows 7. Например, мой компьютер Dell поставляется с Windows 7 Home Premium, я могу только восстановить её обратно на Windows 7 Home Premium. Если я попытаюсь восстановить лицензию Home Premium на операционную систему Windows 7 Ultimate, статус и Product ID покажут в системе “Не Доступен” .На рабочем столе в правом нижнем углу, также будет отображаться сообщение “Эта копия Windows не является подлинной”.
Вот шаги,как использовать ABR для резервного копирования и восстановления Windows 7 OEM лицензии:
1. Скачайте ABRbeta.
2. Запустите ABRbeta.exe и она будет извлекать файлы в новую папку ABR .
3. Запустите activation_backup.exe из папки ABR ,он создаст два новых файла backup-cert.xrm-ms и backup-key.txt в папке ABR . Нажмите Enter, чтобы закрыть ABR. Резервный ключ продукта не является таким же, как ключ для Windows и является OEM-ключом.
4.Резервная копия находится в папке ABR,скопируйте её на USB флэш-накопитель.
5.Установите чистую версию Windows 7.Во время установки,если будет запрос на ввод ключа продукта,оставьте ключ продукта пустыми,и снимите флажок где он должен активироваться автоматически,когда ваш компьютер находится в режиме онлайн.
6.Когда Windows 7 завершит установку,подключите USB флэш-диск и запустите activation_restore.exe из папки ABR.
7.Одновременно нажмите клавиши WIN+Pause/Break,чтобы запустить окно Системы.Прокрутите вниз и вы должны увидеть “Windows активирована” с OEM product ID.
В использовании ABR,нет ничего незаконного,если вы используете его для резервного копирования и восстановления лицензии Windows 7 на один компьютер.Однако,если вы используете его для установки и активации на другие или нескольких компьютерах,тогда вы становитесь на опасную территорию,где Microsoft уже будет обеспокоена.Помните, что есть 2 условия, чтобы получить ABR:
1.Можно делать только резервное копирование заводской активированной Windows 7.Активация Windows 7,не будет работать по телефону или через Интернет .
2.ABR может использоваться только для восстановления лицензии на том же издании Windows 7.Вы можете переключаться между 32bit и 64bit версиями,но не с Home Premium до Ultimate.
P.P.S. Если у Вас есть вопросы, желание прокомментировать или поделиться опытом, напишите, пожалуйста, в комментариях ниже.
- Распечатать
Оцените статью:
- 5
- 4
- 3
- 2
- 1
(4 голоса, среднее: 3.8 из 5)
Поделитесь с друзьями!
1 / 1 / 0 Регистрация: 06.10.2009 Сообщений: 43 |
|
1 |
|
29.11.2009, 15:44. Показов 4002. Ответов 10
Подскажите пожалйста, установила Windows 7 x64 все хорошо работает, только драйвера сами не установились на звуковую карту, решила поставить x86, и комп перестал запускатся. В чем причина может быть?
__________________
0 |
45 / 45 / 2 Регистрация: 05.03.2009 Сообщений: 324 |
|
29.11.2009, 15:53 |
2 |
только из-за дров на звуковую сносить винду???эт зря…даж под самую никакушную звуковуху можно было б дрова найти, кста, а чо за звуковуха то?
0 |
1 / 1 / 0 Регистрация: 06.10.2009 Сообщений: 43 |
|
29.11.2009, 16:25 [ТС] |
3 |
Realtek, да просто сказали что на x86 есть все драйвера и ничего качать не надо. но теперь не ставится ни x64 ни x86
0 |
417 / 285 / 3 Регистрация: 29.07.2009 Сообщений: 1,981 |
|
29.11.2009, 16:27 |
4 |
но теперь не ставится ни x64 ни x86 Подробнее, как ставите? Полный формат системного раздела и загрузка с привода?
0 |
45 / 45 / 2 Регистрация: 05.03.2009 Сообщений: 324 |
|
29.11.2009, 16:29 |
5 |
при установке на запрос необходимо полностью отформатировать раздел, на который собираетесь ставить систему
0 |
1 / 1 / 0 Регистрация: 06.10.2009 Сообщений: 43 |
|
29.11.2009, 19:43 [ТС] |
6 |
Да полностью форматирую диск С, свободно 20 гиг на нем, потом туда и устанавливаю, с привода
0 |
45 / 45 / 2 Регистрация: 05.03.2009 Сообщений: 324 |
|
30.11.2009, 00:20 |
7 |
форматируешь диск или раздел?если в системе два жёстких, то ставь винду на другой…
0 |
178 / 147 / 21 Регистрация: 07.11.2009 Сообщений: 591 |
|
30.11.2009, 13:04 |
8 |
alenkarhangel, что значит перестал запускаться, что значит не устанавливается? Ну что за составление вопроса? Вот представь я приеду в автосервис и скажу, вот там в машине гудит, что делать? Как ты думаешь что меня сразу спросят? Наверное где кудит, как гудит и когда гудит, логично? Так почему же сразу не написать подробно — где, что и когда не работает?
0 |
1 / 1 / 0 Регистрация: 06.10.2009 Сообщений: 43 |
|
30.11.2009, 22:03 [ТС] |
9 |
Ioann, жесткий диск разбит на 2, С отформатирован полностью, 20 гиг. диск Д никогда не форматировался, потому что содержит много нужного.
0 |
178 / 147 / 21 Регистрация: 07.11.2009 Сообщений: 591 |
|
01.12.2009, 14:52 |
10 |
Попробуй загрузиться с dvd диска, если он опять в ребут уйдет, то проблема точно не в винде.
0 |
1 / 1 / 0 Регистрация: 06.10.2009 Сообщений: 43 |
|
05.12.2009, 00:16 [ТС] |
11 |
оки, буду пробовать, если что вернусь
0 |
Как переустановить Windows x64 на x32 или наоборот
Один из самых популярных вопросов по поводу переустановки операционной системы – как переустановить Windows с 32-разрядной на 64-разрядную или наоборот с минимальными усилиями?
Должен разочаровать тех, кто думает, что в Windows есть кнопочка, нажатие на которую сделает из вашей 32-х разрядной операционной системы 64-х битную или наоборот.
Две разновидности одной редакции Windows, например, Windows 7 Home Premium x86 и Windows 7 Home Premium x64, хоть внешне (по интерфейсу) и не отличаются, но это две разные операционные системы, имеющие существенные отличия в работе с устройствами компьютера. Даже тот факт, что драйвера одних и тех же устройств имеют две версии – для 32-х и 64-х битных операционных систем, должен бы натолкнуть на мысль, что просто так обновить Windows с 32-х на 64-х битную не получится.
Поэтому ответ на этот вопрос однозначный. Если у вас была 32-х битная операционная система, но вы, например, расширили объем оперативной памяти компьютера до 4 гигабайт и хотите обновить Windows до 64-х битной версии, то вам придется полностью переустановить операционную систему на компьютере. Причем желательно переустановить «начисто», то есть во время установки отформатировать системный диск и уже на свежеотформатированный диск устанавливать новую версию Windows. Тоже самое касается и варианта, когда вам нужно с 64-битной Windows перейти на 32-х битную версию.
Тут может возникнуть закономерный вопрос – если Windows легальная, то потеряется ли лицензия при установке операционной системы той же редакции, но другой битности? На сколько мне известно, ключ продукта привязки к битности операционной системы не имеет и, скачав из интернета оригинальный образ нужной вам редакции Windows, вы без проблем ее установите со старым ключом и абсолютно легально активируете через интернет или по телефону.
Кроме этого, если у вас действительно лицензионная версия, то я рекомендую обратиться в службу поддержки Майкрософт. Вам предоставят лицензионный образ диска и вы сможете его скачать с официального сайта.
Содержание
- Как на 64-битной Windows запустить программы в режиме совместимости
- Как запускать старые версии программ на современном компьютере
- Поддержка 32-битных приложений в 64-разрядной версии Windows
- Поддержка 32-битных приложений в 64-разрядной Windows
- Устройство поддержки 32-битных приложений в 64-разрядной Windows
- Windows 32 на Windows 64 (WOW64)
- WOW64 эмулирует 32-битную Windows
- Управление файлами и настройками реестра в WOW64
- Перенаправление файлов
- Перенаправление реестра
- Дублирование реестра
- Существует ряд ограничений подсистемы WOW64
- Некоторые, но не все, 64-битные функции доступны 32-разрядным приложениям
- Нельзя смешивать между собой код (Code Injection) 32-битных и 64-битных приложений
- WOW64 не поддерживает 16-разрядные инсталляторы
- Дополнительные возможности для запуска 32-битных приложений в Windows 64
- Windows Virtual PC
- Режим Windows XP (XPM)
- Мультизагрузка ОС Windows
- Подытоживая сказанное о поддержке 32-бит в 64-разрядной Windows
- Какие приложения быстрее 32-битные или 64-битные?
- 7 шагов по переносу программы на 64-битную систему
- Аннотация
- Введение
- 1. Шаг первый. 64-битность бывает разной.
- Давайте разберемся
- 2. Шаг второй. Выясните, нужен ли вам 64-битный вариант вашего продукта
- 2.1. Продолжительность жизненного цикла приложений
- 2.2. Ресурсоемкость приложения
- 2.3. Разработка библиотек
- 2.4. Зависимость вашего продукта от сторонних библиотек
- 2.5. Наличие 16-битных приложений
- 2.6. Наличие кода на ассемблере
- 3. Шаг третий. Инструментарий
- 3.1. Наличие 64-битного компилятора
- 3.2. Наличие 64-битных компьютеров под управлением 64-битных операционных систем
- 3.3. Наличие 64-битных вариантов всех используемых библиотек
- 3.4. Отсутствие встроенного кода на ассемблере
- 3.5. Модернизация методологии тестирования
- 3.6. Новые данные для тестирования
- 3.7. Наличие 64-битных систем защиты
- 3.8. Инсталлятор
- 4. Шаг четвертый. Настройка проекта в Visual Studio 2005/2008
- 5. Шаг пятый. Компиляция приложения
- 6. Диагностика скрытых ошибок
- 6.1. Явное приведение типов
- 6.2. Неявное приведение типов
- 6.3. Работа с битами, сдвиги
Как на 64-битной Windows запустить программы в режиме совместимости
Если в новой 64-битной Windows старая 32-битная программа не запускается или работает неправильно, вы можете запустить ее в режиме совместимости. CHIP расскажет, как это сделать.
Современные компьютеры в большинстве случаев поставляются с установленной операционной системой Windows 10 64 bit. Даже бюджетные модели уже имеют 3 и более Гбайт оперативной памяти, что позволяет задействовать системе всю мощь 64-битной разрядности обработки данных.
Подробнее о преимуществах 64 bit над 32 bit Windows вы можете прочитать в нашей статье «Преимущества перехода на 64 бита».
Но, как бы не была привлекательна 64-разрядная система, зачастую пользователь просто не имеет в своем распоряжении 64-битной программы, с которой он давно работает и которая его полностью устраивает, т.к. производитель ее просто не выпустил. Как правило, такие программы устанавливаются в Windows в отдельную папку Program Files (x86) и их запуск осуществляется в 32-разрядном режиме.
Если в процессе запуска программа выдает ошибку или вообще не запускается, а в Windows 32 bit она работала без проблем, есть шанс запустить ее в специальном режиме, который разработчики назвали «Режим совместимости».
Для этого в Windows 7 щелкните правой кнопкой мыши на ярлыке нужной программы, а затем выберите в контекстном меню «Свойства». В открывшемся окне перейдите на вкладку «Совместимость» и установите флажок «Запустить программу в режиме совместимости с …» и в выпадающем списке укажите вариант системы для запуска.
Нажмите кнопку «OK». После этого попробуйте запустить вашу программу.
Кроме того, в контекстном меню Проводника также имеет смысл попытаться автоматически решить задачу, кликнув по строке «Исправление неполадок совместимости» — в Windows 7.
В Windows 10 при настройке запуска в совместимом режиме на вкладке «Совместимость» имеется отдельная кнопка «Запустить средство устранения проблем с совместимостью». После чего вам предложат либо использовать рекомендованные параметры, либо провести диагностику программы.
Если и после этого программа не запустилась, то стоит подойти к проблеме более основательно и попробовать варианты, указанные на официальном сайте Microsoft.
Более радикальным методом запуска программы является ее установка и использование в виртуальной машине с установленной Windows 7 32 bit. Подробнее, как установить и настроить виртуальную машину вы можете почитать в нашей статье «Как создать и настроить на ПК виртуальную ОС?».
Источник
Как запускать старые версии программ на современном компьютере
Прогресс не стоит на месте. Но что делать, если вы хотите запускать старые версии программ на новеньком компьютере с последней версией операционной системы. Скажем, вы души не чаете в игре, которую помните еще со времен Windows 98.
На самом деле, бесконечно использовать одну и ту же программу нельзя. Ведь технологии меняются. Разработчикам операционных систем приходится делать выбор между обратной совместимостью и новейшими функциями. Конкурентное давление заставляет их в большинстве случаев выбирать второе.
Все же, если старая версия программы была создана для Windows 98, есть большой шанс, что она более-менее сносно будет работать и под Windows 7 или даже 8. Но если программа была старой еще в 1998 году, или создавалась позже, но программисты хорошо позаботились о ее обратной совместимостью с ранними версиями Windows, то на большинстве современных компьютеров возникнут проблемы.
Читайте также: как настроить windows 10 для игр
Если ваша попытка установить или запустить старую версию программы завершается сообщением об ошибке, то очень похоже, что 16-битное приложение вы пытаетесь заставить работать в в 64-битной среде. А это невозможно.
Первые версии Windows были 16-битными, и в них запускались только 16-битные программы. С приходом Windows 95 осуществлен переход на 32-битную среду. Но в ней могли работать как 16-, так и 32-битные программы. Существуют 32- и 64-разрядные варианты Windows Vista, 7 и 8 (какой вариант установлен на вашем компьютере, зависит от типа процессора). В 64-битной версии операционной системы могут работать 32- и 64-битные программы, но не 16-битные.
Вы не знаете, установлена ли на вашем компьютере 32- или 64-разрядная версия Windows? Чтобы узнать это перед тем, как запускать старые версии программ в Windows 7 нажмите на кнопку Пуск в левом нижнем углу рабочего стола, и кликните правой кнопкой мыши по Компьютер. В контекстном меню кликните по Свойства. В Windows 8 нажмите на Поиск, введите «system», выберите Настройки, а затем — Система. В открывшемся окне появится информация об установленной системе, в том числе — о ее разрядности.
Источник
Поддержка 32-битных приложений в 64-разрядной версии Windows
Поддержка 32-битных приложений в 64-разрядной Windows
Появление 64-разрядных Windows вызвало немало вопросов. Поддержка 32-битных приложений, драйверов и всего того, что рассчитано на архитектуру x86. Установка и особенности использования программ. Вводимые ограничения для 32-разрядных приложений. Поддержка старых режимов и многое другое. Все это никак не могло остаться в стороне. Ведь, пласт 32-разрядного наследия слишком велик, и в 64-битной среде его мало чем можно заменить, даже сейчас.
В этой статье приводится обзор подсистемы Windows на Windows 64 (WOW64) и ее методов, которые позволяют Windows поддерживать 32-битные приложения на 64-битной системе.
Примечание: Первая попытка внедрить 64-разрядные системы была достаточно провальной. Жесткие ограничения и отсутствие реальных преимуществ давало о себе знать. На тот момент, даже драйвера под 64-разрядные системы было достаточно сложно найти. Не говоря уже о программах, на которых хоть как-либо была бы заметна разница. Снятие ограничения на 3Гб оперативной памяти, безусловно, сегодня сильное преимущество, но на тот момент это больше напоминало красивый слоган.
Устройство поддержки 32-битных приложений в 64-разрядной Windows
Windows 32 на Windows 64 (WOW64)
WOW64 эмулирует 32-битную Windows
В Windows 64, 32-битные приложения выполняются в эмулированной 32-разрядной операционной системе, которая называется Windows 32 на Windows 64, или WOW64 для краткости. Основной задачей WOW64 является перехват и обработка всех системных вызовов от 32-разрядных приложений.
Для каждого перехваченного системного вызова, WOW64 создает 64-разрядный системный вызов, превращая 32-битные структуры данных в подходящие 64-битные. В последствии, 64-битный системный вызов передается ядру операционной системы для обработки. Все полученные выходные данные 64-битного вызова будут преобразованы и переданы в том формате, на которое приложение рассчитывало. Другими словами, реальные запросы к ядру системы всегда 64-битные. Подсистема WOW64 лишь выступает в качестве посредника, приобразуя данные в подходящие форматы.
Как и 32-битные приложения, WOW64 выполняется от имени пользователя, так что ошибки, которые могут происходить во время преобразования системных вызовов, будут происходить на уровне пользователя. И никак не затронут 64-битное ядро операционной системы.
Тот факт, что WOW64, как и 32-битное приложение, выполняется в режиме пользователя, объясняет причину отсутствия поддержки 32-битных драйверов. Если говорить другими словами, то, для корректного запуска, драйверам требуется режим ядра, который не может обеспечить WOW64. Поэтому, если у вас 64-разрядная Windows, то все драйвера должны быть 64-битными.
Эмулятор WOW64 состоит из следующих 64-разрядных библиотек:
Примечание: Это единственные 64-разрядные библиотеки, которые загружаются в 32-разрядный процесс.
Wow64.dll загружает 32-битную версию (x86) Ntdll.dll и все необходимые 32-битные библиотеки, которые в основном остались без изменений. Однако, некоторые их этих 32-разрядных библиотек все же были изменены, чтобы корректно исполняться в WOW64. Как правило, такие изменения были сделаны из-за того, что они используют оперативную память вместе 64-разрядными компонентами системы
Управление файлами и настройками реестра в WOW64
В дополнение к функциям перехвата и обработки системных вызовов, интерфейс WOW64 так же должен гарантировать, что файлы и параметры реестра 32-битных приложений будут храниться отдельно от файлов и ключей реестра 64-разрядных программ. Для достижения этой цели WOW64 использует два механизма. Перенаправление файлов и реестра, а так же дублирования ключей реестра. Перенаправление поддерживает логическое представление данных и отображает их так, как если бы приложение запускалось в 32-разрядной Windows. Дублирование ключей реестра гарантирует, что изменение ряда параметров, которые не зависят от разрядности, будут доступны как 32-битным, так и 64-битным приложениям.
Перенаправление файлов
Перенаправление файлов позволяет гарантировать, что файлы и каталоги 32- и 64-битных приложений будут храниться отдельно и не мешать друг другу.
Файлы 32-разрядных приложений, по умолчанию, устанавливаются в:
32-разрядные системные файлы устанавливаются в:
Для 64-разрядных приложений, файлы устанавливаются в:
Механизм перенаправления WOW64 гарантирует, что запросы от 32-разрядных приложений к каталогам «C:Program Files» и «C:WINDOWSSYSTEM32» будут перенаправлены на соответствующие каталоги для 32-битных версий.
Однако, существует одна проблема с перенаправлением файлов. Пользователи и разработчики должны быть в курсе этой особенности.
Многие 64-разрядные приложения все еще используют 32-битный режим и процедуры. И не учитывают это при создании инсталлятора. Для того, чтобы приложение было установлено правильно. т.е. в «C:Program Files», программа установки должна сделать системный вызов к операционной системе, чтоб система приостановила механизм перенаправления файлов Wow64. А после установки сделать другой системный вызов, чтобы снова включить перенаправление. Если производить установку без остановки перенаправления, то программа будет установлена в «C:Program Files (x86)». Классическим примером данной ошибки является 64-разрядная версия FireFox 3.5 под кодовым названием «Shiretoko», которая устанавливается в «C:Program Files(x86)Shiretoko». Конечно, Firefox по-прежнему будет нормально функционировать. Единственное, что вы не сможете сделать, так это изменить иконку приложения.
Примечание: Возможно, сейчас эту ошибку в Shiretoko уже исправили. Тем не менее, в ранних версиях было именно так.
Перенаправление реестра
Ключи реестра, специфические для 32-разрядных приложений, будут перенаправлены из ветки:
Так же, иногда, можно встретить записи реестра в другой ветке (хотя это необычно):
Такой подход позволяет 32- и 64-битным приложениям нормально сосуществовать, без проблем с перезаписью настроек друг друга.
Дублирование реестра
Некоторые перенаправленные ключи и значения реестра необходимо дублировать. Это означает, что если 32-разрядное приложение вносит изменения в перенаправленном разделе реестра, то эти изменения необходимо так же применять и для веток 64-разрядных приложений. В данном случае действует принцип «кто последний, тот и прав». Например, если вы установите три приложения, привязывающие себя к одному и тому же расширению файла, то ассоциация с расширением файла должны быть с последним приложением.
В результате этих действий, по двойному щелчку на файле с расширение XYZ в проводнике Windows должно открыться приложение, которое было установлено на 3-ем шаге. Ведь, именно оно последним ассоциировало себя с расширением.
Все это происходит прозрачно для 32-битных приложений в Wow64, которая самостоятельно перехватывает обращения и дублирует необходимые параметры и ключи реестра. Другими словами, 32-разрядные приложения могут выполнятся стандартным образом, необходимые изменения за них внесет Wow64.
Существует ряд ограничений подсистемы WOW64
Некоторые, но не все, 64-битные функции доступны 32-разрядным приложениям
Wow64 позволяет 32-разрядным приложениям использовать некоторые функции и возможности 64-битных систем. Например, при правильной настройке, такие приложения смогут использовать до 4Гб оперативной памяти. Доступ к другим функциям ограничен из-за особенности устройства 64-битных систем. Например, 64-битная ОС Windows поддерживает 64-битные логические операции. Тем не менее, 32-битные приложения не будут иметь доступ к ним, они смогут использовать только 32-битные логические операции.
Примечание: Основной причиной ограничений служит разница в представлении данных 32- и 64-битных приложений. 32-разрядное приложение попросту не рассчитано на 64-разрядные типы данных.
Нельзя смешивать между собой код (Code Injection) 32-битных и 64-битных приложений
В 64-битной ОС Windows нельзя запускать 32-битный код в 64-разрядном процессе, как и нельзя запускать 64-битный код в 32-разрядном процессе. Приложения, использующие инъекции кода (Code Injection) для добавления функциональности в существующие приложения, как правило, будут выдавать ошибки.
Этот факт объясняет, почему большинство 32-битных расширений оболочки Windows не запускаются под 64-разрядной Windows. Большинство таких расширений используют инъекцию кода (Code Injection) для встраивания в проводник Windows
WOW64 не поддерживает 16-разрядные инсталляторы
WOW64 обеспечивает поддержку 16-битных инсталляторов Microsoft, путем замены инсталлятора на совместимую 32-битную версию. Тем не менее, эта поддержка не распространяется на сторонние продукты. Так что, если вам нужно использовать старую программу, то, скорее всего, придется искать эмулятор или портативную версию.
Дополнительные возможности для запуска 32-битных приложений в Windows 64
Windows Virtual PC
Windows Virtual PC это бесплатное программное обеспечение, которое позволяет запускать несколько операционных систем на одном компьютере. Virtual PC обеспечивает специальную среду исполнения, которая поддерживает устаревшее оборудование и программное обеспечение, которое не будет определяться и запускаться в Windows 7. Все запущенные операционные системы под Virtual PC будут выполняться в виртуальной машине. Это означает, что запущенные операционные системы не будут знать о том, что они запущены в другой системе.
Системные требования и набор функциональности существенно различается между версиями Virtual PC и версиями Windows. Так что, прежде чем пытаться использовать Virtual PC, необходимо проверить, что программа поддерживает как вашу операционную систему, так и те ОС, которые будут на ней запущены. Например, одна из последних версий уже не поддерживает версии Windows ниже Windows XP SP3.
Режим Windows XP (XPM)
Режим Windows XP это конкретная и урезанная реализация Windows Virtual PC, которая поставляется с предустановленной копией Windows XP Professional SP3. Этот режим доступен только в версиях Enterprise, Ultimate и Professional Windows 7 64-бит.
Несмотря на то, какие возможности был бы должен представлять этот режим, многие, кто использовал XPM, настоятельно советуют использовать этот режим только в качестве последнего средства. По сравнению с другими продуктами виртуализации, производительность разочаровывает, а конфигурация по умолчанию вызывает ряд вопросов безопасности.
Примечание: К некоторым более дательным настройкам режима совместимости все же можно обратиться. Более подробную информацию вы можете найти в обзоре Как запустить старые программы на Windows 7 / Vista? (см. Microsoft Application Compatibility Toolkit).
Мультизагрузка ОС Windows
Вы можете установить более одной версии Windows на одном компьютере, с помощью мультизагрузчика. Например, установить 32-разрядную и 64-разрядную версии Windows рядом друг с другом. Каждая операционная система устанавливается на отдельный раздел диска, а менеджер загрузки устанавливается на разделе по умолчанию. Менеджер загрузки позволяет выбрать и запустить операционную систему, которую вы хотите сейчас использовать.
Хоть, вы и не можете одновременно использовать больше одной операционной системы, эта функциональность является достаточно полезной. По сравнению с виртуальными машинами, такой способ не имеет никаких проблем с совместимостью и такие системы гораздо легче настраивать и обслуживать. Кроме всего прочего, установив 32-разрядную версию рядом с 64-битной, вы сохраните возможность запускать 16-битные приложения.
Подытоживая сказанное о поддержке 32-бит в 64-разрядной Windows
Большинство 32-разрядных приложений будут вполне счастливо себя чувствовать в Windows 64. Основными исключениями будут:
Некоторые приложения смогут запускаться с ограничениями. Это так же касается деинсталляторов, программ для очистки реестра и программ для тюнинга, так как они имеют доступ только к той части реестра, которую им показывает Wow64.
Если вы никак не можете запустить 32-битное приложение, то рассмотрите вариант с виртуализацией или мультизагрузкой нескольких операционных систем.
Какие приложения быстрее 32-битные или 64-битные?
Этот вопрос звучит достаточно часто. Но, нет никакого общего правила или коэффициента умножения, поскольку все зависит от задач и используемых функций процессора.
Если сравнивать 32- и 64-разрядные приложения в своих родных средах, то 32-битное приложение, как правило, использует меньше памяти, чем эквивалентное 64-разрядное приложение. Это происходит потому, что 64-битные версии используют 64-битные структуры данных, которые занимают вдвое больше места. Дополнительный размер напрямую влияет на время запуска и закрытия программы, а так же на другие виды операций, связанных с доступом к дисковым накопителям. Обычно, это означает, что 32-разрядные приложения будут выполняться быстрее. Тем не менее, использование 64-битными программами особенностей 64-разрядного процессора потенциально позволяет приложению выполняться на 25% быстрее, по сравнению с 32-битными программами.
Кроме того, необходимо помнить, что запуск 32-битного приложения на 64-разрядной Windows означает запуск Wow64, поэтому анализ производительности на 32-битном процессоре можно отложить в сторону. Запуск Wow64 означает не только затраты на преобразование вызовов, но и учет механизмов перенаправления и дублирования, которым требуются не только процессорное время, но и оперативная память. Поэтому, возможно, 32-разрядное приложение будет выполняться быстрее 64-битного, но оно однозначно будет выполняться медленнее, чем при эквивалентном запуске на 32-битном процессоре.
И самое главное, вы всегда должны понимать, что увеличение размера регистров процессора, а именно это и обозначают цифры 32 и 64, никак не влияет на саму задачу. Если задача не зависит от объема или диапазонов значений, то увеличение разрядности не будет играть почти никакой роли. Другими словами, от того что вы сложите продукты в большой холодильник, продуктов не станет больше и быстрее они не охладятся.
Теперь, вы знаете ряд особенностей запуска 32-битных приложений на 64-разрядных Windows. А так же что такое Wow64 и какие ограничения он накладывает на 32-разрядные программы.
Источник
7 шагов по переносу программы на 64-битную систему
Аннотация
В статье рассмотрены основные шаги, обеспечивающие корректный перенос 32-битных Windows приложений на 64-битные Windows системы. Хотя статья ориентирована на разработчиков, использующих язык Си/Си++ в среде Visual Studio 2005/2008, она будет полезна и другим разработчикам, планирующим перенос своих приложений под 64-битные системы.
Введение
В статье описаны основные моменты, с которыми сталкиваются разработчики, планирующие мигрировать 32-битные программы на 64-битные системы. Конечно, список рассмотренных вопросов не полон, но хочется надеяться, что со временем будет предложен расширенный вариант этой статьи. Автор будет благодарен отзывам, комментариям и вопросам, которые позволят улучшить информативность этой статьи.
1. Шаг первый. 64-битность бывает разной.
Давайте разберемся
В рамках архитектуры вычислительной техники под термином «64-битный» понимают 64-битные целые и другие типы данных, имеющих размер 64 бита. Под «64-битными» системами могут пониматься 64-битные архитектуры микропроцессоров (например, EM64T, IA-64) или 64-битные операционные системы (например, Windows XP Professional x64 Edition) [1].
AMD64 (она же x86-64, Intel 64, EM64T, x64) — 64-битная архитектура микропроцессора и соответствующий набор инструкций, разработанные компанией AMD [2]. Этот набор инструкций был лицензирован компанией Intel под названием EM64T (Intel64). Архитектура AMD64 представляет собой расширение архитектуры x86 с полной обратной совместимостью. Архитектура получила широкое распространение в качестве базы персональных компьютеров и рабочих станций.
IA-64 — 64-битная микропроцессорная архитектура, разработанная совместно компаниями Intel и Hewlett Packard [3]. Реализована в микропроцессорах Itanium и Itanium 2 [4]. Архитектура используется в основном в многопроцессорных серверах и кластерных системах.
AMD64 и IA-64 это две различные 64-битные архитектуры не совместимые между собой. Поэтому разработчикам следует сразу решить, необходимо ли поддерживать обе эти архитектуры или только одну. В большинстве случаев, если вы не разрабатываете узкоспециализированное программное обеспечение для кластерных систем или не реализуете свою высокопроизводительную СУБД, то с большой вероятностью вам необходимо реализовать поддержку только архитектуры AMD64, которая получила значительно большее распространение, чем IA-64. Особенно это относится к программному обеспечению для рынка персональных компьютеров, который почти на 100 процентов занят архитектурой AMD64.
Далее в статье мы будем говорить только об архитектуре AMD64 (EM64T, x64), так как ее использование сейчас наиболее актуально для разработчиков прикладного программного обеспечения.
Говоря о различных архитектурах, следует упомянуть о понятии «Модель данных». Под моделью данных следует понимать соотношения размерностей типов, принятых в рамках среды разработки. Для одной операционной системы могут существовать несколько средств разработки, придерживающихся разных моделей данных. Но обычно преобладает только одна модель, наиболее соответствующая аппаратной и программной среде. Примером может служить 64-битная операционная система Windows, в которой родной моделью данных является LLP64. Но для совместимости 64-битная система Windows поддерживает исполнение 32-битных программ, которые работают в режиме модели данных ILP32LL. В таблице N1 приведены сведения об основных моделях данных.
Таблица N1. Модели данных
Используемая модель данных накладывает отпечаток на процесс разработки 64-битных приложений, так как в коде программ необходимо учитывать разрядность используемых данных [5].
2. Шаг второй. Выясните, нужен ли вам 64-битный вариант вашего продукта
Начать освоение 64-битных систем следует с вопроса «А нужно ли нам пересобрать свой проект для 64-битной системы?». На этот вопрос надо обязательно дать ответ, но не торопясь, подумав. С одной стороны можно отстать от своих конкурентов, вовремя не предложив 64-битные решения. С другой — можно впустую потратить время на 64-битное приложение, которое не даст никаких конкурентных преимуществ.
Перечислим основные факторы, которые помогут сделать вам выбор.
2.1. Продолжительность жизненного цикла приложений
Не следует создавать 64-битную версию приложения с коротким жизненным циклом. Благодаря подсистеме WOW64 старые 32-битные приложения достаточно хорошо работают на 64-битных Windows системах и поэтому делать программу 64-битной, которая через 2 года перестанет поддерживаться, смысла не имеет [6]. Более того, практика показала, что переход на 64-битные версии Windows затянулся и возможно большинство ваших пользователей в краткосрочной перспективе будут использовать только 32-битный вариант вашего программного решения.
Если планируется длительное развитие и длительная поддержка программного продукта, то следует начинать работать над 64-битным вариантом вашего решения. Это можно делать неспешно, но учтите, что чем дольше у вас не будет полноценного 64-битного варианта, тем больше сложностей может возникать с поддержкой такого приложения, устанавливаемого на 64-битные версии Windows.
2.2. Ресурсоемкость приложения
Перекомпиляция программы для 64-битной системы позволит ей использовать огромные объемы оперативной памяти, а также убыстрит скорость ее работы на 5-15%. Убыстрение на 5-10% произойдет за счет использования архитектурных возможностей 64-битного процессора, например большего количества регистров. Еще 1%-5% прироста скорости обуславливается отсутствием прослойки WOW64, которая транслирует вызовы API между 32-битными приложениями и 64-битной операционной системой.
Если ваша программа не работает с большими объемами данных (более 2GB) и скорость ее работы не критична, то переход на 64-битную в ближайшее время систему не столь актуален.
Кстати, даже простые 32-битные приложения, могут получить преимущество от их запуска в 64-битной среде. Вы, наверное, знаете, что программа собранная с ключом /LARGEADDRESSAWARE:YES может выделять до 3-х гигабайт памяти, если 32-битная операционная система Windows запущена с ключом /3gb. Эта же 32-битная программа, запущенная на 64-битной системе может выделить почти 4 GB памяти (на практике около 3.5 GB).
2.3. Разработка библиотек
Если вы разрабатываете библиотеки, компоненты или иные элементы, с помощью которых сторонние разработчики создают свое программное обеспечение, то вы должны проявить оперативность в создании 64-битного варианта своей продукции. В противном случае, ваши клиенты, заинтересованные в выпуске 64-битных версий, будут вынуждены искать альтернативные решения. Например, некоторые разработчики программно-аппаратной защиты откликнулись с большой задержкой на появление 64-битных программ, что заставило ряд клиентов искать другие инструменты для защиты своих программ.
Дополнительным преимуществом от выпуска 64-битной версии библиотеки является то, что вы можете продавать ее как отдельный продукт. Таким образом, ваши клиенты, желающие создавать как 32-битные, так и 64-битные приложения будут вынуждены приобретать 2 различные лицензии. Например, такая политика используется компанией Spatial Corporation при продаже библиотеки Spatial ACIS.
2.4. Зависимость вашего продукта от сторонних библиотек
Прежде чем планировать работу над созданием 64-битной версий вашего продукта выясните, имеются ли 64-битные варианты библиотек и компонентов, которые в нем используются. Также узнайте, какова ценовая политика по отношению к 64-битному варианту библиотеки. Все это можно выяснить, посетив сайт разработчика библиотеки. Если поддержка отсутствует, то заранее поищите альтернативные решения, поддерживающие 64-битные системы.
2.5. Наличие 16-битных приложений
Если в ваших решениях все еще присутствуют 16-битные модули, то пора от них избавиться. Работа 16-битных приложений в 64-битных версиях Windows не поддерживается.
Здесь следует пояснить один момент, связанный с использованием 16-битных инсталляторов. Они до сих пор используются для установки некоторых 32-битных приложений. Создан специальный механизм, который на лету подменяет ряд наиболее популярных 16-битных инсталляторов на более новые версии. Это может вызвать неверное мнение, что 16-битные программы по-прежнему работают в 64-битной среде. Помните, это не так.
2.6. Наличие кода на ассемблере
Не забывайте, что использование большого объема кода на ассемблере, может существенно повысить стоимость создания 64-битной версии приложения.
Взвесив все перечисленные факты, все за и против, примите решение, следует ли вам переносить ваш проект на 64-битные системы. И если это так, то давайте пойдем дальше.
3. Шаг третий. Инструментарий
Если вы приняли решение о разработке 64-битной версии вашего продукта и готовы потратить на это время, это еще не гарантирует успех. Дело в том, что вы должны обладать всем необходимым инструментарием и здесь могут быть неприятные казусы.
Самой простой, но и самой непреодолимой, может стать проблема отсутствия 64-битного компилятора. Статья пишется в 2009 году, но все еще нет 64-битного компилятора C++ Builder от Codegear [7]. Его выпуск ожидается только к концу этого года. Невозможно обойти подобную проблему, если конечно но переписать весь проект, например, с использованием Visual Studio. Но если с отсутствием 64-битного компилятора все понятно, то другие аналогичные проблемы могут оказаться более скрытными и вылезти уже на этапе работ по переносу проекта на новую архитектуру. Поэтому, хочется посоветовать заранее провести исследование, существуют ли все необходимые компоненты, которые потребуются для реализации 64-битной версии вашего продукта. Вас могут поджидать неприятные сюрпризы.
Конечно, перечислить все, что может понадобиться для проекта здесь невозможно, но все-таки предложу список, который поможет вам соорентироваться и возможно вспомнить о других моментах, которые необходимы для реализации вашего 64-битного проекта:
3.1. Наличие 64-битного компилятора
Сложно что-то еще сказать о важности наличия 64-битного компилятора. Он просто должен быть.
Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания статьи) Visual Studio 2008, то следующая таблица N2 поможет помочь определить, какая из редакций Visual Studio вам необходима.
Таблица N2. Возможности различных редакций Visual Studio 2008
3.2. Наличие 64-битных компьютеров под управлением 64-битных операционных систем
Можно конечно использовать виртуальные машины для запуска 64-битных приложений на 32-битной технике, но это крайне неудобно и не обеспечит необходимого уровня тестовых испытаний. Желательно, чтобы в машинах было установлено не менее 4-8 гигабайт оперативной памяти.
3.3. Наличие 64-битных вариантов всех используемых библиотек
Если библиотеки представлены в исходных кодах, то должна присутствовать 64-битная конфигурация проекта. Самостоятельно заниматься модернизацией библиотеки для ее сборки под 64-битную систему может быть неблагодарным и сложным занятием, а результат может оказаться ненадежным и содержащим ошибки. Также вы можете нарушить этим лицензионные соглашения. Если вы используете библиотеки в виде бинарных модулей, то вы также должны узнать, существуют ли 64-битные модули. Вы не сможете использовать 32-битные DLL внутри 64-битного приложения. Можно создать специальную обвязку через COM, но эта будет отдельной большой, сложной задачей [8]. Также учтите, что приобретение 64-битной версии библиотеки может стоить дополнительных денег.
3.4. Отсутствие встроенного кода на ассемблере
Visual C++ не поддерживает 64-битный встроенный ассемблер. Вы должны использовать или внешний 64-битный ассемблер (например, MASM) или иметь реализацию той же функциональности на языке Си/Си++ [9].
3.5. Модернизация методологии тестирования
Существенная переработка методологии тестирования, модернизация юнит-тестов, использование новых инструментальных средств. Более подробно об этом будет сказано ниже, но не забывайте учесть это на этапе оценки временных затрат на миграцию приложения на новую систему [10].
3.6. Новые данные для тестирования
Если вы разрабатываете ресурсоемкие приложения, потребляющие большой объем оперативной памяти, то вам необходимо позаботиться о пополнении базы тестовых входных данных. При нагрузочном тестировании 64-битных приложений желательно выходить за пределы 4 гигабайт потребляемой памяти. Многие ошибки могут проявиться только при таких условиях.
3.7. Наличие 64-битных систем защиты
Используемая система защиты, должна поддерживать 64-битные системы в полном необходимом вам объеме. Например, компания Aladdin достаточно быстро выпустила 64-битные драйвера для поддержки аппаратных ключей Hasp. Но очень долго отсутсвовала система автоматической защиты 64-битных бинарных файлов (программа Hasp Envelop). Таким образом, механизм защиты приходилось реализовывать самостоятельно внутри программного кода, что являлось дополнительной сложной задачей, требующей квалификации и времени. Не забывайте про подобные моменты, связанные с обеспечением защиты, системой обновлений и так далее.
3.8. Инсталлятор
Необходимо наличие нового инсталлятора, способного полноценно устанавливать 64-битные приложения. Хочется здесь сразу предостеречь об одной традиционной ошибке. Это создание 64-битных инсталляторов для установки 32/64-битных программных продуктов. Подготавливая 64-битую версию приложения, разработчики часто хотят довести «64-битность» в нем до абсолюта. И создают 64-битный инсталлятор, забывая о том, что у пользователей 32-битной операционной системы такой инсталляционный пакет просто не запустится. Обратим внимание, что не запустится не 32-битное приложение включенное в дистрибутив наряду с 64-битным, а именно сам установщик. Ведь если дистрибутив представляет собой 64-битное приложение, то на 32-битной операционной системе он, конечно же, не запустится. Самое обидное в этом то, что пользователь никак не сможет догадаться, что же происходит. Он просто увидит инсталляционный пакет, который невозможно запустить.
4. Шаг четвертый. Настройка проекта в Visual Studio 2005/2008
Создание 64-битной конфигурации проекта в Visual Studio 2005/2008 выглядит достаточно просто. Сложности будут подстерегать вас на этапе сборки новой конфигурации и поиска в ней ошибок. Для создания же 64-битной конфигурации достаточно выполнить следующие 4 шага:
Запускаем менеджер конфигураций, как показано на рисунке N1:
Рисунок 1. Запуск менеджера конфигураций
В менеджере конфигураций выбираем поддержку новой платформе (рисунок N2):
Рисунок 2. Создание новой конфигурации
Выбираем 64-битную платформу (x64), а в качестве основы выбираем настройки от 32-битной версии (рисунок N3). Те настройки, которые влияют на режим сборки среда Visual Studio скорректирует сама.
Рисунок 3. Выбираем x64 в качестве платформы и берем за основу конфигурацию Win32
Добавление новой конфигурации завершено, и мы можем выбрать 64-битный вариант конфигурации и приступить к компиляции 64-битного приложения. Выбор 64-битной конфигурации для сборки показан на рисунке N4.
Рисунок 4. Теперь доступна 32-битная и 64-битная конфигурация
Если вам повезет, то дополнительно заниматься настройкой 64-битного проекта необходимости не будет. Но это сильно зависит от проекта, его сложности и количества используемых библиотек. Единственное, что стоит сразу изменить, это размер стека. В случае если в вашем проекте используется стек размером по умолчанию, то есть в 1 мегабайт, то есть смысл задать его размером в 2 мегабайта для 64-битной версии. Это не обязательно, но лучше заранее подстраховаться. Если у вас используется размер стека, отличный от размера по умолчанию, то есть смысл сделать его для 64-битной версии в 2 раза больше. Для этого в настройках проекта найдите и измените параметры Stack Reserve Size и Stack Commit Size.
5. Шаг пятый. Компиляция приложения
Здесь было бы хорошо рассказать о типичных проблемах, возникающих на этапе компиляции 64-битной конфигурации. Рассмотреть, какие проблемы возникают со сторонними библиотеками, рассказать, что компилятор в коде связанного с функциями WInAPI более не допустит помещения указателя в тип LONG и вам будет необходимо модернизировать свой код и использовать тип LONG_PTG. И многое, многое другое. К сожалению этого так много и ошибки так разнообразны, что нет возможности изложить это в рамках одной статьи и даже, пожалуй, книги. Вам придется самим просмотреть все ошибки, которые выдаст компилятор и новые предупреждения, которых ранее не было и в каждом отдельно случае разобраться, как модернизировать код.
Частично облегчить жизнь может коллекция ссылок на ресурсы, посвященные разработке 64-битных приложений: http://www.viva64.com/links/64-bit-development/. Коллекция постоянно пополняется и автор будет благодарен читателям, если они пришлют ему ссылки на ресурсы, которые, по их мнению, заслуживают внимания.
Остановимся здесь только на типах, которые могут представлять интерес для разработчиков при миграции приложений. Эти типы представлены в Таблице N3. Большинство ошибок при компиляции будет связано с использование именно этих типов.
Тип | Размерностьтипа наплатформеx32 / x64 | Примечание |
int | 32 / 32 | Базовый тип. На 64-битных системах остался 32-битным. |
long | 32 / 32 | Базовый тип. На 64-битных Windows системах остался 32-битным. Учтите, что в 64-битных Linux системах этот тип был расширен до 64-бит. Не забывайте об этом если разрабатываете код, который должен работать компилироваться для Windows и для Linux систем. |
size_t | 32 / 64 | Базовый беззнаковый тип. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. В тип size_t может быть безопасно помещен указатель (исключение составляют указатели на функции классов, но это особенный случай). |
ptrdiff_t | 32 / 64 | Аналогичен типу size_t, но является знаковым. Результат выражения, где один указатель вычитается из другого (ptr1-ptr2), как раз будет иметь тип ptrdiff_t. |
Указатель | 32 / 64 | Размер указателя напрямую зависит от разрядности платформы. Будьте аккуратны при приведении укзателей к другим типам. |
__int64 | 64 / 64 | Знаковый 64-битный тип. |
DWORD | 32 / 32 | 32-битный беззнаковый тип. Объявлен в WinDef.h как:typedef unsigned long DWORD; |
DWORDLONG | 64 / 64 | 64-битный беззнаковый тип. Объявлен в WinNT.h как:typedef ULONGLONG DWORDLONG; |
DWORD_PTR | 32 / 64 | Беззнаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:typedef ULONG_PTR DWORD_PTR; |
DWORD32 | 32 / 32 | 32-битный беззнаковый тип. Объявлен в BaseTsd.h как:typedef unsigned int DWORD32; |
DWORD64 | 64 / 64 | 64-битный беззнаковый тип. Объявлен в BaseTsd.h как:typedef unsigned __int64 DWORD64; |
HALF_PTR | 16 / 32 | Половина указателя. Объявлен в Basetsd.h как:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif |
INT_PTR | 32 / 64 | Знаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif |
LONG | 32 / 32 | Знаковый тип, который остался 32-битным. Поэтому во многих случаях теперь следует использовать LONG_PTR. Объявлен в WinNT.h как:typedef long LONG; |
LONG_PTR | 32 / 64 | Знаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif |
LPARAM | 32 / 64 | Параметр для посылки сообщений. Объявлен в WinNT.h как:typedef LONG_PTR LPARAM; |
SIZE_T | 32 / 64 | Аналог типа size_t. Объявлен в BaseTsd.h как:typedef ULONG_PTR SIZE_T; |
SSIZE_T | 32 / 64 | Аналог типа ptrdiff_t. Объявлен в BaseTsd.h как:typedef LONG_PTR SSIZE_T; |
ULONG_PTR | 32 / 64 | Беззнаковый тип, в который можно помещать указатель. Объявлен в BaseTsd.h как:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif |
WORD | 16 / 16 | Беззнаковый 16-битный тип. Объявлен в WinDef.h как:typedef unsigned short WORD; |
WPARAM | 32 / 64 | Параметр для посылки сообщений. Объявлен в WinDef.h как:typedef UINT_PTR WPARAM; |
Таблица N3. Типы представляющие интерес при переносе 32-битных программ на 64-битые Windows системы.
6. Диагностика скрытых ошибок
Если вы думаете, что после исправления всех ошибок компиляции будет получено долгожданное 64-битное приложение, то придется вас разочаровать. Самое сложное впереди. На этапе компиляции вами будут исправлены самые явные ошибки, которые смог обнаружить компилятор, которые в основном связаны с невозможностью неявного приведения типов. Но это верхушка айсберга. Основная часть ошибок скрыта. Эти ошибки с точки зрения абстрактного языка Си++ смотрятся безопасно или замаскированы явными приведениями типов. Таких ошибок в несколько раз больше, чем количество ошибок выявленных на этапе компиляции.
На ключ /Wp64 надежды возлагать не следует. Это ключ часто преподносится как чудесное средство поиска 64-битных ошибок. В действительности ключ /Wp64 всего лишь дает возможность при компиляции 32-битного кода получить некоторые предупреждения, что в 64-битном режиме определенные участки кода будут некорректны. При компиляции 64-битного кода эти предупреждения будут выданы компилятором в любом случае. И поэтому при компиляции 64-битного приложения ключ /Wp64 игнорируется. И уж тем более этот ключ не поможет в поиске скрытых ошибок [11].
Рассмотрим несколько примеров скрытых ошибок.
6.1. Явное приведение типов
Самый простой, но вовсе не самый легкий для обнаружения класс ошибок связан с явным приведением типов, при которых происходит обрезание значащих бит.
Распространенным пример — приведение указателей к 32-битным типам при передачи их в функции, такие как SendMessage:
Здесь явное приведение типа используется для превращения указателя в числовой тип. Для 32-битной архитектуры приведенный пример корректен, так как последний параметр функции SendMessage имеет тип LPARAM, который на 32-битной архитектуре совпадает с DWORD. Для 64-битной архитектуре использование DWORD ошибочно и должно быть заменено на LPARAM. Тип LPARAM имеет в зависимости от архитектуры размер 32 или 64 бита.
Это простой случай, но часто приведение типа выглядит более изысканно и обнаружить его используя предупреждения компилятора или поиском по тексту программы невозможно. Явные приведения типов подавляют диагностику компилятора, поскольку они именно и предназначены, чтобы сказать компилятору что приведение типов корректно и программист взял на себя ответственность за безопасность кода. Явный поиск тоже не поможет. Типы могут быть не стандартные имена (заданные программистом через typedef), а способов осуществить явное приведение типов тоже не мало. Для надежной диагностики подобных ошибок необходимо использовать только специальный инструментарий, такой как анализаторы Viva64 или PC-Lint.
6.2. Неявное приведение типов
Следующий пример связан уже с неявным приведением типа, при котором также происходит потеря значащих бит. Код функции fread осуществляет чтение из файла, но некорректен при попытке чтения более 2 гигабайт данных на 64-битной системе.
Функция __fread возвращает тип size_t, но для хранения количества прочитанных байт используется тип int. В результате при больших объемах читаемых данных функция может вернуть не то количество байт, которое на самом деле будет прочитано.
Вы можете сказать, что это безграмотный код начинающих, что о таком приведении типа сообщит компилятор и что вообще такой код легко найти и поправить. Это теоретически. А практически в реальной жизни с большими проектами все может обстоять иначе. Этот пример взят из исходного кода FreeBSD. Ошибка была поправлена только в декабре 2008 года! Это притом, что первая (экспериментальная) 64-битная версия FreeBSD вышла еще в июне 2003 года.
Вот исходный код до исправления:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.14
А вот исправленный вариант (декабрь 2008) года:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.15
6.3. Работа с битами, сдвиги
Легко сделать ошибку в коде работящем с отдельными битами. Следующий тип ошибки связан с операциями сдвига. Рассмотрим пример:
Приведенный код работоспособен на 32-битной архитектуре и позволяет выставлять бит с номерами от 0 до 31 в единицу. После переноса программы на 64-битную платформу возникнет необходимость выставлять биты от 0 до 63. Но данный код никогда не выставит биты, с номерами 32-63. Обратите внимание, что «1» имеет тип int и при сдвиге на 32 позиции произойдет переполнение, как показано на рисунке 5. Получим мы в результате 0 (рисунок 5-B) или 1 (рисунок 5-C) зависит от реализации компилятора.
Рисунок 5. A — Корректная установка 31-ого бита в 32-битном коде; B,C — Ошибка установки 32-ого бита на 64-битной системе (два варианта поведения)
Для исправления кода необходимо сделать константу «1» того же типа, что и переменная mask:
Заметим также, что неисправленный код приведет еще к одной интересной ошибке. При выставлении 31 бита на 64-битной системе результатом работы функции будет значение 0xffffffff80000000 (см. рисунок 6). Результатом выражения 1
Источник