Как перезапустить x32 битный процесс в 64-разрядном режиме?

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,253
Реакции
6,284

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,648
Реакции
6,118
Делал такой перезапуск процесса в проекте Virulogs.
Вот набросал пример.
Смотри как это работает:
(батник запускать из-под c:\windows\syswow64\cmd.exe)
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: Получаю необходимые переменные
call :GetOSBitness bitOS
call :GetProcessBitness "%bitOS%" bitProc

echo.
echo Битность ОС: %bitOS%
echo Битность процесса: %bitProc%
echo.

:: Сравниванию битности и перезапускаю процесс под x64 при необходимости
call :DoEnvironRelaunch "%bitOS%" "%bitProc%"
pause

goto :eof


:DoEnvironRelaunch [in.OS.Bitness] [in.Process.Bitness]
  :: Контроль запуска скрипта в среде, соответствующей разрядности ОС
  :: Попытка перезапустить процесс в режиме x64

  if /i "%~1"=="x64" if /i "%~2" NEQ "x64" (
    rem Если ОС >= Vista или XP с hotfix-ом http://support.microsoft.com/kb/942589
    rem попытаюсь перезапустить процесс через алиас Sysnative
    if exist "%windir%\Sysnative\*" (
      ;;; echo. Скрипт запущен из 32-битной среды. Пытаюсь перезапустить из x64.
      ;;; echo. Нажмите ENTER.
      pause >NUL
      cls
      "%windir%\Sysnative\cmd.exe" /c "%~nx0"
      exit
    ) else (
      ;;; echo Предпринят запуск из-под 32-битного приложения.
      ;;; echo СТРОГО рекомендуется перезапустить скрипт
      ;;; echo из проводника Windows.
      ;;; echo Работа скрипта будет завершена.
      exit
    )
)
Exit /B 0

:GetOSBitness [out.var]
  Set "%~1=x64"& If /i "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set "%~1=x32"
Exit /B

:GetProcessBitness [in.OS.Bitness] [out.var]
  set "%~2=x32"& if "%~1"=="x64" echo "%PROGRAMFILES%" |>nul find /i "x86" || set "%~2=x64"
Exit /B
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,253
Реакции
6,284
Dragokas, вопрос: если запускается процесс командной строкой,то достаточно ли будет контролировать перезапуск консоли?
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,253
Реакции
6,284
Я имею это будет просто рекомендация запустить как положено?
Думаю может скриптом проводник изначально запускать.
Или вообще на vb переписать
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,648
Реакции
6,118
Поудаляй все pause.
Добавь этот код в самое начало своего.
Он сам себя перезапустит, если определит, что битность процесса не совпадает с битностью ОС.

Единственное, что ты можешь наоборот добавить pause в конец вот этого сообщения:
;;; echo Предпринят запуск из-под 32-битного приложения.
;;; echo СТРОГО рекомендуется перезапустить скрипт
;;; echo из проводника Windows.
;;; echo Работа скрипта будет завершена.

Это может случится только в одном случае - запуск на XP x64, на который не установлено вот это обновление: http://support.microsoft.com/kb/942589
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,253
Реакции
6,284
Это может случится только в одном случае - запуск на XP x64, на который не установлено вот это обновление: http://support.microsoft.com/kb/942589
Это вообще маловероятно)))

Допилю обновление и это тоже добавлю в скрипт.
Над тем,что бы через explorer стартовать тоже подумаю.

Спасибо за помощь)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,648
Реакции
6,118
Koza Nozdri, только учти, что если ты откроешь папку (explorer.exe) через свой скрипт, то он тоже запустится под WOW64 (т.е. 32-разрядным),
поэтому все делать нужно только через алиас Sysnative. К чему сложности, если все и так делается на автомате...
 
Сверху Снизу