Как запустить 32 битную программу на 64 битной системе Windows

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

64-разрядные технологии Microsoft впервые появились в Windows Server 2003 для процессоров Itanium 2 (архитектура ихвестна как «IA64») а также для eXtended CPUs (архитектура известна как «x64»). 64-bit технология имеет много преимуществ, но также поднимает новые вопросы для разработчиков программного обеспечения. Например, вам может понадобиться необходимость доступа к существующим 32-разрядным библиотекам DLL из 64-битного процесса.

Главное преимущество технологии 64-бит состоит в способности адресовать до 8 ТБ памяти, против максимальных 2 Гб для 32-битных процессов. Как результат, 64-разрядная технология позволяет проводить операции с большим объёмом данных в оперативной памяти без необходимости временного сброса памяти на жётский диск. Это может значительно повысить производительность и открыть новые алгоритмы обработки данных базирующихся на очень больших доступных объёмов оперативной памяти. Как бы то ни было аргументы для миграции существующего программного обеспечения на 64-битную платформу имеют место быть.

Как поставить 32 битную систему на 64 битную в играх

Многие приложения, написанные с помощью C/C++ могут быть легко портированы под 64-битную платформу, особенно если они написаны в виде монолитного модуля. Иногда достаточно просто пересобрать исходные коды с использованием x64/IA64 компилятора. Однако уже опубликованное или базирующееся на модулях ПО может вызвать проблемы.

Конфликт: 64-bit против 32-bit

Основная проблема миграции возникает при необходимости портирования 32-разрядных программных компонентов, которые не могут быть пересобраны, возможно, потому что исходный код потерян, к нему нет доступа или одна из зависимостей этого модуля не можeт быть перенесена на 64-bit платформу.

32-битное ПО по-прежнему поддерживается на 64-битной платформе. Так 32-битные процессы могут выполняться внутри Windows WOW64-подсистемы, которая является частью всех 64-битных систем Windows. Однако 64-разрядный процесс не может загружать 32-разрядные модули в своё адресное пространство, также и 32-разрядные процессы не могут загружать 64-разрядные модули в своё адресное пространство. Единственный способ общения между 32-битными и 64-битными модулями возможен путём межпроцессного взаимодействия (IPC). Другими словами, 32-разрядные и 64-разрядные процессы могут обмениваться данными с использованием IPC-механизмов, например такие как out-of-proc COM, сокеты, сообщения Windows или MMF (Memory mapped files).

Например, 32-битный программный продукт содержит основной модуль WeatherReport (см. рисунок выше), который внутри обращается к DLL WeatherStationControl. Пока основной модуль и DLL являются 32-разрядными, продукт может работать как на 32-битных, так и 64-битных платформах (внутри WOW64). Если основной модуль и DLL переносятся на 64-битную платформу, то они могут работать в рамках 64-битных процессов. Однако, если только основной модуль переносится на 64-bit, он не сможет загружать 32-разрядные DLL.

КАК 64 БИТНУЮ ИГРУ ЗАПУСТИТЬ НА 32 БИТНОЙ СИСТЕМЕ 2018(for honor,spider-men) (ч.4)

Лучшим способом переноса такого продукта на 64-битную платформу является миграция как основного модуля, так и всех его зависимостей, но если хоть одна зависимая DLL не может быть перенесена, то продукт не может быть загружен в 64-битном процессе, следовательно приложение работать не будет.

Решение: суррогатный процесс

Эта проблема может быть решена путем загрузки зависимой 32-битной DLL в отдельном пространстве 32-разрядного процесса. Основной модуль, работая в качестве 64-битного процесса, может получить доступ к зависимым DLL’ям через границы процессов, используя IPC (Смотри MSDN reference).

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

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

Одним из возможных путей сокращения этих расходов является реализация 64-разрядной DLL обертки, которая предоставит те же функции, что и оригинальная 32-битная DLL. Эта обёртка уже внутри себя скроет детали IPC вызовов оригинальной 32-битной DLL, загруженной в 32-битный суррогатный процесс.

64-битная обёртка (WeatherStationControl64.DLL) экспортирует тот же интерфейс, что и оригинальная 32-битная DLL (WeatherStationControl.DLL), то бишь предоставляет главному модулю WeatherReport те же сервисы без необходимости внесения изменений в код модуля WeatherReport.

Читайте также:
Как завершить программу в Windows

Основные затраты этого решения связаны с реализацией суррогатного процесса, загружающего 32-битную DLL и реализаццей 64-битной DLL оболочки. Фактически затраты будут зависеть от того, какая из IPC технологий будет использоваться для обмена данными между 64-битным и 32-битным процессами.

Использование COM для межпроцессного взаимодействия

Один из самых популярных методов IPC — это DCOM (Distributed COM). Первоначально разработанная для распределенных систем, DCOM по-прежнему поддерживается как на 64-битных платформах Windows. Модули COM могут быть собраны как 32-разрядные так и 64-разрядные. Единственным ограничением является то, что 64-битные и 32-битные модули не могут находиться в одном и том же процессе, следовательно они должны взаимодействовать через границы процессов. Это делается с помощью out-of-process (OOP) COM компонентов, следующим образом:

  1. Создаём 32-битный COM-Сервер, который загрузит 32-битную DLL и опубликует 32-bit DLL интерфейс как COM-интерфейс, реализованный внутри через делегирование к API исходной 32-битной DLL.
  2. Конфигурируем этот COM-Сервер для out-of-proc загрузки любым способом создания COM+ приложений (используя dllhost.exe в качестве суррогата).
    Также можно реализовать этот COM-компонент как специальный COM-Сервер EXE, используя ATL COM Server в качестве хостящего процесса.
    Можно также помеcтить этот COM-компонент внутрь Win32-сервиса.
  3. Создаём 64-разрядную DLL оболочку, реализующую тот же интерфейс, как оригинальная 32-битная DLL. Обёртка будет импортировать COM-интерфейс из COM-объекта, созданного выше, и транслировать каждый API вызов в обращение к COM-интерфейсу, передавая параметры вызова и получая возвращаемые значения.

32-разрядная DLL (WeatherStationControl.DLL) используется СОМ-объектом (WeatherStationWrapper), который предоставляет интерфейс 32-битной DLL в качестве COM-интерфейса. 64-битная DLL обёртка (WeatherStationControl64.DLL) делает вызовы COM-интерфейса, которые уже делегируют всю работу оригинальным API вызовам исходной 32-битой DLL. Основной процесс (WeatherReport) использует интерфейс, предоставляемый 64-разрядной DLL обёрткой, но на самом деле работа выполняется в оригинальной 32-битной DLL.

Это решение должно быть значительно дешевле, чем создание 64-разрядную версию 32-битных DLL с нуля. Библиотека ATL, поддерживающаяся Visual Studio, вкупе со всеми своими визардами и готовыми фрагментами кода, также должны помочь снизить затраты миграции за счет экономии времени и снижения вероятности ошибок.

Последствия

Однако существует ряд вещей, которые вам все еще нужно иметь в виду:

  1. Выравнивание
    Выравнивание данных в памяти отличается в 32-bit и 64-bit процессах. Это означает, что более сложные пользовательские структуры данных могут быть сериализованы 32-разрядным процессом иначе, чем ожидается в 64-битном проыцессе, и наоборот. Microsoft Windows Platform SDK включает документацию о различиях в соответствие памяти данными между 32-битной и 64-битных процессов.
  2. Типы данных
    В большинстве случаев, 64-разрядная Windows использует те же типы данных, как 32-битной версии. Различия в основном в указателях, которые 32-битные в 32-битной версий Windows и 64-битные в 64-битных Windows.
    Указатель полученных данных типов, таких как HANDLE и HWND также различны между 32-битной и 64-разрядных версиях. Windows позволяет вести единый базовый код для 32-разрядных версиях и 64-битного программного обеспечения, предлагая полиморфные типы данных, которые имеют различную длину в зависимости от целевой платформы, например INT_PTR представляет целое с таким же размером, как и указатель. Любая переменная этого типа будет целым числом, которое составляет 32 бита на 32-битной платформе и 64 бита на 64-битной платформе.
  3. COM инициализации
    Вы можете получить доступ к СОМ-объекту, если он был успешно инициализирован. Функция COM API CoInitialize() должна вызываться для каждого потока, который собирается работать с COM-объектом, т.е. делать вызовы COM-интерфейсов, также должна вызываться CoUninitialize() перед завершением потока.(см. MSDN). Это правило должно строго соблюдаться, если основной процесс вызывает оригинальные 32-битные DLL из разных потоков выполнения.
  4. Безопасность
    При использовании out-of-proc, экземпляры COM-объектов находятся в отдельном процессе, независимо от того используете вы стандартный суррогатной процесс, EXE COM-Сервер или Win32 сервис. Это может означать, что вызовы 32-битной DLL могут произойти в другом контексте безопасности, чем у основного процесса, особенно если основной процесс интенсивно использует имперсонирование. Если это так, вы можете настроить собственные параметры доступа для out-of-proc компонента, или осуществлять внутреннее имперсонирование внутри COM-объекта.
  5. Производительность
    IPC-решение почти наверняка будет медленнее, чем прямые вызовы DLL. Маршалинг данных за границы процессов, автоматическое преобразование данных между 32 и 64 бит, WOW64 особенности, задержки инстанцирования экземпляров COM-объектов — всё это будет влиять на производительность. Однако есть много методов оптимизации, которые можно использовать, таких как COM pooling, кэширование данных внутри DLL-оболочки, реализация критичных к производительности интерфейсов в 64-битной DLL, и так далее.
  6. Перенаправление
    Подсистема WOW64 отвечает за поддержку 32-битных модулей на 64-битных Windows. Чтобы избежать нежелательных коллизий между 32-битным и 64-битным ПО, особенно при доступе к файловой системы и реестру, WOW64 изолирует 32-разрядные модули, используя механизм, называемый перенаправление (см. MSDN).
    Например, для 64-битного процесса при получении пути системной папки возвращается %WINDOWS%System32, а для 32-разрядного процесса возвращается %WINDOWS%SysWOW64.
    Путь к папке исполняемого файла будет «Program Files» для 64-битного процесса, но для 32-разрядного процесса это будет «Program Files (x86)».
    Раздел реестра HKEY_LOCAL_MACHINESoftware содержит настройки и данные для 64-разрядных процессов, а ключ HKEY_LOCAL_MACHINESoftwareWOW6432Node содержит настройки и данные для 32-разрядных процессов.
    Это перенаправление активируется автоматически, когда программные модули пытаются получить предопределённые системные пути или ключи реестра.
  7. Модули ядра
    Предложенное здесь решение работает для 32-разрядных DLL, использующихся в user mode, но не работает с 32-битными драйверами. Это происходит, потому что 32-битные модули ядра не могут быть использованы на 64-битной платформе, без исключений или обходных путей. Если ваш продукт включает в себя любой модуль уровня ядра, таких как драйвер устройства, то единственно возможный путь миграции — это портировать модуль ядра на 64-битную платформу.
  8. Установка.
    Использование out-of-proc COM-компонента требует изменений в процедуре установки вашего ПО, т.к. COM-компонент должен быть установлен и зарегистрирован в системе. Как уже говорилось выше в пункте Безопасность, для этого может потребоваться настройка специальных параметров доступа для COM-компонента.
  • Running 32-bit Applications
  • Best Practices for WOW64
  • MSDN on Interprocess Communications
  • Introduction to Developing Applications for the 64-bit Itanium-based Version of Windows
  • Understanding CoInitialize()
  • Running 32-bit applications on 64-bit Windows (including information on Redirection)
  • x32 unmanaged dll из x64 managed dll C++ 2.0
  • Как в 64-bit приложение загрузить 32-bit dll
Читайте также:
Как удалить программу установки Виндовс 10

Источник: rakafon.blogspot.com

Запуск 64-разрядных программ на 32-битной системе

Как гласит название, есть ли способ запустить x64-разрядную программу на 32-битной системе ? Если нет, есть ли эмулятор или есть способ обновления с 32 до 64 бит бесплатно? ПРИМЕЧАНИЕ. Я использую Windows 10.

  • Windows 10 на asus x44h не работает
  • Скрыть раздел из Windows 10 для предотвращения проблем с гибридным отключением в Linux
  • Почему SYSTEM_DRV Partition неожиданно отображается в Проводнике Windows 10 Lenovo?
  • Идентификация Windows 10 Device Harddisk1 DR2
  • Поиск Windows не запускается (ошибка 1053)
  • LICEcap не соблюдает высокие настройки DPI в Windows 8 и 10
  • Как изменить размер заголовка окна в Windows 10
  • Ярлык клавиатуры для «Инвертировать выбор»

Есть один путь. Вы можете использовать Qemu или аналогичный эмулятор для эмуляции полного 64-битного хоста . Однако это будет сопровождаться значительной потерей скорости.

И просто чтобы подчеркнуть эту последнюю часть немного:

  • Запуск гипервизора для запуска 32-разрядной виртуальной машины на 64-битном хосте позволит большинству программ работать на почти полной скорости. (Давным-давно я тестировал и достигал 99% скорости хоста, используя рабочую станцию ​​vmware 5 и dnetc, которая является типичной программой для пользовательского пространства.)
  • Теперь, если вы собираетесь подражать, ожидайте, что цифры будут наоборот. 99% -ная потеря скорости не удивительна.

Итак, как ответ на часть 1: Технически да. Возможно, вы не захотите этого.

Или есть способ обновления от x32 до x64 бит бесплатно.

Если на вашем компьютере установлено 64-битное оборудование (в основном все, начиная с последнего десятилетия), вы можете установить 64-разрядную ОС. Ответ ДэвидаПостилла на это очень полный. Обратите внимание, что это означает полную переустановку. Вы не можете изменить ОС Windows с 32 до 64 бит. Вам придется полностью его заменить.

Не связано с qemu. Это только тот, который я впервые вспомнил

Как отметил Исмаил Мигель: до тех пор, пока ваше оборудование будет 64 бит, вы можете использовать VirtualBox для запуска 64-разрядной ОС. Даже если у вас ОС OS 32 бит. Документацию для этого можно найти здесь .

Есть ли способ запустить x64-разрядную программу на x32-разрядной системе?

Вы не можете (обычно) запускать 64-разрядные программы на 32-разрядной ОС.

См. Другой ответ Хеннса для (не рекомендованного) обходного пути.

Есть ли способ обновления с x32 до x64 бит бесплатно (Windows 10)?

Является ли ваш ПК 64-битным?

Во-первых, вам нужно будет подтвердить, поддерживает ли процессор на вашем компьютере 64-разрядную версию. Для этого откройте приложение «Настройки» в меню «Пуск», выберите «Система» и выберите «О программе». Посмотрите справа от «Тип системы».

Если вы видите «32-разрядную операционную систему, процессор на базе x64», это означает, что вы используете 32-разрядную версию Windows 10, но ваш процессор может работать с 64-разрядной версией. Если он не говорит, что у вас есть процессор на базе x64, у вас есть 32-разрядный процессор и не может перейти на 64-разрядную версию.

Введите описание изображения здесь

У вашего процессора есть требуемые функции?

Некоторые из первых 64-разрядных процессоров не имеют необходимых функций для запуска 64-разрядных версий Windows 10, даже если они совместимы с 64-разрядными версиями. В частности, Windows 10 требует PAE, SSE2 и NX.

У Microsoft есть больше информации об этом здесь . ПК также нуждаются в поддержке CMPXCHG16b , к которой не относятся некоторые из первых потребительских 64-разрядных процессоров.

64-разрядная версия Windows 10 откажется устанавливать, если ваш процессор не поддерживает эти вещи.

Если вы хотите проверить, прежде чем начать процесс установки, загрузите и запустите CPU Z.

«SSE2» появится в разделе «Инструкции», если он поддерживается. «EM64T» или «AMD64» должны указывать, что PAE поддерживается. «VT-x» или « VT-d » всегда указывает, что поддерживается NX.

Введите описание изображения здесь

На некоторых старых компьютерах вам может потребоваться включить NX (иногда называемый XD) в BIOS компьютера.

Если вы получите сообщение об ошибке, когда ваш процессор не поддерживается во время процесса установки, зайдите в BIOS вашего компьютера и найдите вариант под названием «Без бита eXecute (NX)», «Отключить eXecute (XD)», «No Execute Memory Protect» »,« Выключить защиту от отказа »,« EDB («Выполнять отключенный бит»), «EVP (Enhanced Virus Protection)» или что-то подобное. Посмотрите под вкладками «Безопасность» или «Дополнительно» где-нибудь в вашем BIOS для этого параметра.

Аппаратное обеспечение вашего ПК предлагает 64-разрядные драйверы?

Даже если ваш процессор и материнская плата поддерживают правильные функции, вы можете подумать, будет ли аппаратное обеспечение вашего компьютера работать с 64-разрядной версией Windows.

Для 64-разрядных версий Windows требуются 64-разрядные аппаратные драйверы, а 32-разрядные версии, которые вы используете в вашей текущей системе Windows 10, работать не будут.

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

Чтобы проверить это, вы можете посетить веб-страницы драйверов производителя для вашего оборудования и посмотреть, доступны ли 64-битные драйверы. Вам не обязательно обязательно загружать их с веб-сайта производителя – они должны быть включены в Windows 10 или автоматически загружаться из Центра обновления Windows.

Но старое оборудование – например, особенно древний принтер – может не предлагать 64-битные драйверы.

В любом случае, вы можете убедиться, установив 64-разрядные версии Windows. Если он не поддерживает ваш процессор, он сообщит вам об этом.

Если драйверы оборудования недоступны, вы увидите их после установки, и вы сможете перейти на 32-разрядную версию Windows 10, если ваше оборудование не работает.

Сделайте чистую установку

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

Предупреждение.

Перед продолжением создайте резервные копии важных файлов . Этот процесс уничтожит установленные программы и файлы.

Во-первых, если вы еще не обновили до Windows 10, вам нужно будет использовать инструмент обновления для обновления. Вы получите 32-разрядную версию Windows 10, если ранее вы использовали 32-разрядную версию Windows 7 или 8.1.

Но процесс обновления предоставит вашему компьютеру лицензию Windows 10. Убедитесь, что ваша текущая 32-разрядная версия Windows 10 активирована в разделе «Настройки»> «Обновление и безопасность»> «Активация».

Введите описание изображения здесь

После того, как вы уже используете активированную версию Windows 10, загрузите средство создания мультимедиа Windows 10 из Microsoft . Если вы используете 32-битную версию Windows 10 на данный момент, вам придется загрузить и запустить 32-битный инструмент.

Выберите «Создать установочный носитель для другого ПК» и используйте этот инструмент для создания USB-накопителя или записи диска в Windows 10.

Когда вы нажмете мастер, вы спросите, хотите ли вы создавать 32-разрядные или 64-разрядные Установка носитель информации. Выберите 64-битную архитектуру.

Введите описание изображения здесь

Затем перезагрузите компьютер и загрузитесь с установочного носителя. Установите Windows 10, выбрав «Custom install» и перезапишите текущую версию Windows.

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

Если вы хотите вернуться к 32-разрядной версии Windows, вам потребуется загрузить средство создания медиа – 64-разрядного, если вы используете 64-разрядную версию Windows 10, – и используйте его для Создать 32-разрядный установочный носитель. Загрузите с установочного носителя и переустановите 32-разрядную версию поверх 64-разрядной версии.

Источник Как переключиться с 32-разрядной Windows 10 на 64-разрядную Windows 10

  • Windows 10 Ubuntu Bash Shell: как смонтировать другие диски Windows?
  • Почему cmd не завершит выполнение командного файла?
Читайте также:
Как очистить компьютер Windows 7 от программ

Источник: www.bilee.com

My TechDays

Запуск внешней 32-битной программы из приложения или сценария в 64-разрядных ОС Windows

Сегодня я наконец-то понял, почему в моей программе CMDTools в 64-разрядных ОС не работает команда nbtstat.

Каталог System32 зарезервирован для 64-битных приложений, SysWOW64 – для 32-битных. При запуске 32-битного приложения оно пытается получить доступ в System32, и ОС сама перенаправляет его в папку SysWOW64. Так как файл nbtstat.exe находится только в папке System32, мы получаем ошибку.

Как же получить доступ из 32-битного приложения в System32? Решение есть! Нужно использовать специльное имя-alias SysNative. В программах или сценариях соответственно изменить путь на %WinDir%SysNative вместо %WinDir%System32. WOW64-процессор в данном случае не будет перенаправлять запрос в SysWOW64.

Данный метода работает только для 32-битных приложений. Подробная информация содержится здесь.

В общем, как вариант, для успешного запуска в 64-разрядных системах 32-битных системных приложений из сценариев или других программ используйте путь %WinDir%SysNativeAppName.exe, и точно не ошибетесь.

Источник: apavlenko71.wordpress.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru