2008-10-02 6 views
10

Pour afficher la boîte de dialogue UAC dans Vista lorsque vous écrivez dans la ruche HKLM, nous choisissons de ne pas utiliser l'API Win32 Registry, car lorsque les autorisations Vista sont manquantes, nous devons relancer l'ensemble de notre application avec des droits d'administrateur. Au lieu de cela, nous faisons cette astuce:Comment lancer un processus Windows en 64 bits à partir d'un code 32 bits?

ShellExecute(hWnd, "runas" /* display UAC prompt on Vista */, windir + "\\Reg", "add HKLM\\Software\\Company\\KeyName /v valueName /t REG_MULTI_TZ /d ValueData", NULL, SW_HIDE); 

Cette solution fonctionne très bien, en plus que notre application est un 32 bits l'un, et il exécute la commande REG.EXE que ce serait une application 32 bits en utilisant le WOW couche de compatibilité! :(Si REG.EXE est exécuté à partir de la ligne de commande, il est correctement exécuté en mode 64 bits, ce qui est important, car s'il est exécuté en tant qu'application 32 bits, les clés de registre se retrouveront au mauvais endroit en raison de registry reflection. Il est donc possible de lancer une application 64 bits par programmation à partir d'une application 32 bits et de ne pas l'exécuter à l'aide du sous-système WOW64 comme son processus parent 32 bits (par exemple, un suffixe "*" dans le Gestionnaire des tâches

Répondre

11

essayez ceci (à partir d'un processus de 32bit):

> %WINDIR%\sysnative\reg.exe query ... 

(constaté que here).

+0

Si cela fonctionne, cela ressemble à une bonne astuce à avoir dans son sac. –

+0

sysnative ne fonctionnera pas sur XP64, c'est Vista et plus tard seulement. –

+0

@DavidHeffernan: Donc vous piègez l'échec et essayez à nouveau en utilisant System32. –

2

Avez-vous envisagé de créer une petite application "helper" pour faire la mise à jour du registre pour vous? Si vous compilez en 64bit et incluez un manifeste indiquant des droits d'administrateur, alors il couvrira les deux bases pour vous

Il existe des API pour détecter le "bitness" du système d'exploitation sur lequel vous êtes en train de tourner, donc vous pourriez, peut-être, compiler à la fois RegistryUpdate32.exe et RegistryUpdate64.exe et appeler le pertinent.

8

L'exécution d'un programme natif 32 bits ou 64 bits (non géré) dépend uniquement de l'exécutable. Il existe deux copies de reg.exe, dans C: \ Windows \ System32 (64 bits) et C: \ Windows \ SysWOW64 (32 bits). Parce que vous ne spécifiez pas un chemin, vous obtenez tout ce qui apparaît en premier dans la variable d'environnement PATH, qui est la version 32 bits pour un processus 32 bits.

Vous devriez vraiment factoriser cette fonction dans un programme séparé ou objet COM, et marquer le programme avec un manifeste, ou lancer l'objet COM en utilisant le COM elevation moniker.

+0

N'oubliez pas qu'en raison de la redirection du système de fichiers (ou de n'importe quel MS l'appelle), un processus 32 bits qui essaie d'ouvrir/exec "c: \ Windows \ System32 \ foo.exe" ouvrira ce fichier/exec silencieusement redirigé vers "C: \ windows \ SysWow64 \ foo.exe" sauf si des mesures spécifiques sont prises pour désactiver la redirection. –

+0

Oui Mike, c'est ce que j'ai remarqué après avoir marqué ça comme une "réponse". C'est-à-dire - j'avais * écrit * le chemin complet "System32" dans mon test, donc il aurait dû choisir la version 64 bits de toute façon, mais ne l'a pas fait. J'ai supposé que c'était pour la raison que vous avez indiquée. :) – Jonas

+0

Le commentaire "tout ce qui apparaît en premier dans le PATH" n'est pas tout à fait correct. Le PATH dit system32 si c'est 32 ou 64 bits. Lorsque vous appelez ShellExecute à partir d'un processus 32 bits, vous obtenez la redirection du système de fichiers vers syswow64. Ce n'est pas comme si vous pouviez inverser l'ordre dans lequel le répertoire système apparaît dans votre variable PATH et changer le comportement !! –

Questions connexes