Wie man einen 64-Bit-Prozess von einem 32-Bit-Prozess starten
-
18-09-2019 - |
Frage
Ich versuche, eine 64-Bit-ausführbare Datei (java.exe) von unserer 32-Bit .NET Anwendung auszuführen. Ich verwende Process
Klasse und Aufrufen cmd /c <command name>
, um alle möglichen Befehle zu unterstützen (wie dir
, cd
usw.).
Das Problem ist, dass auf meiner Maschine, die ich 64-Bit-Version von JRE installiert und java.exe ist nur von C:\Windows\System32
Ordnern (x64). Ich habe versucht, deutlich hingewiesen 64-Bit-Version von cmd.exe
beginnend von C:\Windows\System32\cmd.exe
Aufruf aber es wird wegen Aufruf Prozess 32 Bit SysWOW64
umgeleitet werden.
Gibt es etwas, was ich tun kann, um diese an der Arbeit?
Bearbeiten Die ganze cmd /c
Sache ist ein bisschen von einem roten Hering. Es ist nicht Teil des Problems, ist 64 Bit-Programme ausführen zu können.
Lösung
Sie können vorübergehend Dateisystem Umleitung um den Anruf zu Process.Start die entsprechenden APIs zu P / Invoke ist Wow64DisableWow64FsRedirection und Wow64RevertWow64FsRedirection .
Eine weitere Option ist% windir verwenden% \ Sysnative, die unter Windows Vista verfügbar ist und oben.
Andere Tipps
Was Sie tun, ist, dass Sie% windir verwenden% \ Sysnative zu lösen 64-Bit cmd.exe und dann starten Sie Ihre anderen 64-Bit-Programm über "/ c" Befehlszeilenoption.
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:\>
Für den Fall, könnte dies helfen .. http://msdn.microsoft.com/en-us /library/aa384187(VS.85).aspx
Beachten Sie, dass, wenn die Anwendung manifestiert die UAC-Eingabeaufforderung zu zeigen, dann Umleitung erfolgt nicht. Und auch einige Ordner sind von Umleitung.
"Sysnative" scheint einige Nachteile zu haben.
Beispiel:
Wenn Sie powershell.exe über C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe
einige Cmdlets wie Get-AppxProvisionedPackage" and "Get-WindowsCapability
beginnen Ausnahmen nicht funktionieren / werfen:
Get-AppxProvisionedPackage: „Fehler beim Setzen aktuellen Verzeichnisses "C: \ Windows \ Sysnative \ Windows \ v1.0": Ein Teil des Weges "C: \ Windows \ Sysnative \ Windows \ v1.0" nicht gefunden "werden könnte
(übersetzt aus dem Deutschen „Fehler beim Festlegen des current Verzeichnis auf "C: \ Windows \ Sysnative \ Windows \ v1.0": Ein Teil des Pfades "C: \ Windows \ Sysnative \ Windows \ v1.0" Könnte nicht gefunden Werden ".)
Es könnte ähnliche Probleme andere Prozesse als Powershell ausgeführt wird (immer dann, wenn der Prozess Quellverzeichnis ist wichtig?) ...