如何从32位进程启动64位进程

时间:2010-01-05 01:28:35

标签: .net process 32bit-64bit syswow64

我正在尝试从32位.NET应用程序运行64位可执行文件(java.exe)。我正在使用Process类并调用cmd /c <command name>以支持所有可能的命令(例如dircd等)。

问题是我的机器上安装了64位版本的JRE,而java.exe只能从C:\Windows\System32文件夹(x64)获得。我已经尝试通过调用cmd.exe来明确地启动64位版本的C:\Windows\System32\cmd.exe,但由于调用进程为32位,它被重定向到SysWOW64

我能做些什么来让它发挥作用吗?

编辑整个cmd /c事情有点像红鲱鱼。这不是问题的一部分,能够运行64位可执行文件是。

7 个答案:

答案 0 :(得分:34)

您可以暂时禁用围绕调用Process.Start的文件系统重定向,P / Invoke的相应API是Wow64DisableWow64FsRedirectionWow64RevertWow64FsRedirection

另一种选择是使用%windir%\ sysnative,它可以在Windows Vista及更高版本上使用。

答案 1 :(得分:12)

您所做的是使用%windir%\ sysnative来解析64位CMD.EXE,然后通过“/ c”命令行选项启动其他64位程序。

答案 2 :(得分:4)

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:\>

答案 3 :(得分:3)

以防万一这可能会有所帮助.. http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx

请注意,如果显示应用程序以显示UAC提示,则不会进行重定向。还有一些文件夹可以免于重定向。

答案 4 :(得分:0)

这是在cmd窗口内切换到64位cmd的一种方法,以防您发现自己是32位版本:

if %PROCESSOR_ARCHITECTURE%==x86 %windir%\sysnative\cmd

或者有条件从32位批处理进程中以64位执行:

if %PROCESSOR_ARCHITECTURE%==x86 "%windir%\sysnative\cmd" /c "someProgram"

甚至更好:

set "commands=multiple commands & to execute"
if %PROCESSOR_ARCHITECTURE%==x86 ( "%windir%\sysnative\cmd" /c "%commands%" ) else ( %commands% )

答案 5 :(得分:0)

要通过 64 位 cmd.exe 运行进程/脚本,您可以使用:

%windir%\SysWOW64\cmd.exe /c %windir%\sysnative\cmd.exe /c ProgramToRun parameters

此解决方案普遍适用于 32 位和 64 位进程。


附注
%windir%\sysnative 仅存在于 32 位进程中。
%windir%\SysWOW64 存在于 32 位和 64 位进程中。

答案 6 :(得分:-1)

“系统”似乎有一些缺点。

示例: 当您通过C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe启动powershell.exe时,某些Get-AppxProvisionedPackage" and "Get-WindowsCapability之类的CmdLets不起作用/抛出异常:

  

Get-AppxProvisionedPackage:“将当前目录设置为错误   “ C:\ Windows \ SysNative \ WindowsPowerShell \ v1.0”:部分路径   找不到“ C:\ Windows \ SysNative \ WindowsPowerShell \ v1.0”

     

(翻译自德语“ Fehler beim Festlegen des aktuellen   版本“ C:\ Windows \ SysNative \ WindowsPowerShell \ v1.0”:Ein   Teil des Pfades“ C:\ Windows \ SysNative \ WindowsPowerShell \ v1.0”   nicht gefunden werden。”)

运行除powershell之外的其他进程可能会遇到类似的问题(何时进程源目录重要?)...