Comment commencer un processus 64 bits à partir d'un processus 32 bits
-
18-09-2019 - |
Question
Je suis en train d'exécuter un exécutable 64 bits (java.exe) de notre application .NET 32 bits. J'utilise la classe Process
et invoquer cmd /c <command name>
afin de soutenir toutes les commandes possibles (comme dir
, cd
etc).
Le problème est que sur ma machine que j'ai installé la version 64 bits de JRE et java.exe est uniquement disponible à partir du dossier de C:\Windows\System32
(x64). Je l'ai essayé à partir explicily version 64 bits de cmd.exe
en appelant C:\Windows\System32\cmd.exe
mais il est redirigé vers SysWOW64
en raison du processus d'appel étant 32 bits.
Y at-il autre chose que je peux faire pour que cela fonctionne?
EDIT Toute chose cmd /c
est un peu d'un hareng saur. Il ne fait pas partie du problème, être en mesure d'exécuter 64 bits est executables.
La solution
Vous pouvez désactiver temporairement la redirection du système de fichiers autour de l'appel à Process.Start, l'API appropriées de P à / Invoke sont et href="http://pinvoke.net/default.aspx/kernel32/Wow64RevertWow64FsRedirection.html" rel="noreferrer"> Wow64RevertWow64FsRedirection .
Une autre option consiste à utiliser% windir% \ Sysnative, qui est disponible sur Windows Vista et au-dessus.
Autres conseils
Ce que vous faites est que vous utilisez% windir% \ Sysnative pour résoudre cmd.exe 64 bits, puis vous lancez votre autre programme 64 bits via « / c » option de ligne de commande.
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:\>
Juste au cas où cela pourrait aider .. http://msdn.microsoft.com/en-us /library/aa384187(VS.85).aspx
Notez que si la demande se manifeste à afficher l'invite UAC, alors la redirection ne se fera pas. Et certains dossiers sont exemptés de redirection.
"Sysnative" semble avoir quelques inconvénients.
Exemple:
Lorsque vous démarrez powershell.exe via C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe
quelques CmdLets comme Get-AppxProvisionedPackage" and "Get-WindowsCapability
ne fonctionnent pas / lancer des exceptions:
Get-AppxProvisionedPackage: « Erreur de réglage répertoire courant "C: \ Windows \ Sysnative \ WindowsPowerShell \ v1.0": Une partie du chemin "C: \ Windows \ Sysnative \ WindowsPowerShell \ v1.0" introuvable "
(traduit de l'allemand « 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. ")
Il pourrait y avoir des problèmes similaires en cours d'exécution d'autres processus que Powershell (chaque fois que le répertoire source de processus est important?) ...