¿Cómo lanzar un proceso de Windows como de 64 bits a partir de un código de 32 bits?

StackOverflow https://stackoverflow.com/questions/162309

  •  03-07-2019
  •  | 
  •  

Pregunta

Para abrir el cuadro de diálogo UAC en Vista al escribir en la sección de registro de HKLM, optamos por no utilizar la API de registro de Win32, ya que cuando faltan los permisos de Vista, deberíamos reiniciar toda nuestra aplicación con derechos de administrador. En su lugar, hacemos este truco:

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);

Esta solución funciona bien, además de que nuestra aplicación es de 32 bits, y ejecuta el comando REG.EXE como si fuera una aplicación de 32 bits que utiliza la capa de compatibilidad WOW. :( Si REG.EXE se ejecuta desde la línea de comandos, se ejecuta correctamente en modo de 64 bits. Esto es importante, porque si se ejecuta como una aplicación de 32 bits, las claves de registro terminarán en el lugar incorrecto debido a reflexión del registro .

Entonces, ¿hay alguna manera de iniciar una aplicación de 64 bits programáticamente desde una aplicación de 32 bits y no ejecutarla utilizando el subsistema WOW64 como su proceso principal de 32 bits (es decir, un sufijo " * " en la Tarea Gerente)? ??

¿Fue útil?

Solución

prueba esto (desde un proceso de 32 bits):

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

(encontró que aquí ).

Otros consejos

La ejecución de un programa nativo (no administrado) de 32 bits o de 64 bits depende únicamente del ejecutable. Hay dos copias de reg.exe , en C: \ Windows \ System32 (64 bits) y C: \ Windows \ SysWOW64 (32 bits). Como no especifica una ruta, obtiene lo que aparece primero en la variable de entorno PATH , que es la versión de 32 bits para un proceso de 32 bits.

Realmente debería factorizar esta función en un programa u objeto COM separado, y marcar el programa con un manifiesto, o iniciar el objeto COM usando moniker de elevación COM .

¿Has considerado crear un pequeño " helper " Aplicación para hacer la actualización del registro para usted? Si lo compila a 64 bits e incluye un manifiesto que indica que requiere derechos de administrador, entonces cubrirá ambas bases para usted.

Hay API para detectar el " bitness " del sistema operativo en el que se está ejecutando, por lo que podría, posiblemente, compilar tanto RegistryUpdate32.exe como RegistryUpdate64.exe y llamar al relevante.

Una cosa que he hecho como una solución para mí es hacer un cambio en la inhabilitación de la redirección:

http: // msdn .microsoft.com / en-us / library / windows / desktop / aa365744 (v = vs.85) .aspx

Siempre puedes volver a encenderlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top