Подтвердить что ты не робот

Как запустить 64-разрядный процесс из 32-битного процесса

Я пытаюсь запустить 64-битный исполняемый файл (java.exe) из нашего 32-битного .NET-приложения. Я использую класс Process и вызываю cmd /c <command name>, чтобы поддерживать все возможные команды (например, dir, cd и т.д.).

Проблема в том, что на моей машине я установил 64-разрядную версию JRE, а java.exe доступен только в папке C:\Windows\System32 (x64). Я попытался объяснить 64-разрядную версию cmd.exe, вызвав C:\Windows\System32\cmd.exe, но перенаправляется на SysWOW64 из-за того, что процесс вызова составляет 32 бит.

Есть ли что-нибудь еще, что я могу сделать, чтобы заставить это работать?

EDIT Вся вещь cmd /c - это немного красная селедка. Это не часть проблемы, возможность запуска 64-разрядных исполняемых файлов.

4b9b3361

Ответ 1

Вы можете временно отключить перенаправление файловой системы вокруг вызова Process.Start, соответствующий API для P/Invoke Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection.

Другим вариантом является использование% windir%\sysnative, доступного в Windows Vista и выше.

Ответ 2

Что вы делаете, так это то, что вы используете% windir%\sysnative для разрешения 64-разрядного CMD.EXE, а затем вы запускаете свою другую 64-битную программу с помощью командной строки "/c".

Ответ 3

c:\>set proc
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601

c:\>c:\windows\sysnative\cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

c:\>set proc
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601

c:\>

Ответ 4

На всякий случай это может помочь. http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx

Обратите внимание, что если приложение проявляется, чтобы показать приглашение UAC, перенаправление не произойдет. А также некоторые папки освобождаются от перенаправления.

Ответ 5

"sysnative", кажется, имеет некоторые недостатки.

Пример: при запуске powershell.exe через C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe некоторые CmdLets, такие как Get-AppxProvisionedPackage" and "Get-WindowsCapability, не работают/генерируют исключения:

Get-AppxProvisionedPackage: "Ошибка установки текущего каталога на" C:\Windows\SysNative\WindowsPowerShell\v1.0 ": часть пути" C:\Windows\SysNative\WindowsPowerShell\v1.0 "не найдена"

(перевод с немецкого "Fehler beim Festlegen des aktuellen Verzeichnisses auf" C:\Windows\SysNative\WindowsPowerShell\v1.0 ": Ein Teil des Pfades" C:\Windows\SysNative\WindowsPowerShell\v1.0 "konnte nicht gefunden werden. ")

Могут быть похожие проблемы при запуске других процессов, кроме powershell (когда важен каталог с исходным кодом процесса?)...