¿Cómo puede una aplicación de 32 bits de encontrar la ubicación de 64 bits directorio Archivos de Programa en Windows Vista de 64 bits?

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

  •  21-09-2019
  •  | 
  •  

Pregunta

Yo estoy luchando con un problema de cómo determinar la ubicación de los 64 bits directorio de Archivos de Programa en la versión de 64 bits de Windows Vista desde una aplicación de 32 bits.

Las llamadas a SHGetKnownFolderPath(FOLDERID_ProgramFilesX64) no devuelven nada.El MSDN artículo KNOWNFOLDERID establece también que esta llamada en particular con FOLDERID_ProgramFilesX64 no es compatible para una aplicación de 32 bits.

Me gustaría evitar tanto como sea posible escribir la ruta de acceso "C:\Program los Archivos".Hacer algo como GetWindowsDirectory(), la extracción de la unidad del valor de retorno y la adición de "\Archivos de Programa" a no es atractivo, ya sea.

¿Cómo puede una aplicación de 32 bits obtener correctamente la ubicación de la carpeta de Windows Vista de 64 bits?

De fondo

Nuestra aplicación tiene un componente de servicio que se supone para iniciar otros procesos basados en peticiones de usuario específicos de la sesión componente.Las aplicaciones lanzadas puede ser de 32-bits o 64-bits.Hacer esto es a través de CreateProcessAsUser() por el paso de un token de inicio de usuario de la sesión proceso.Para llamar a CreateProcessAsUser, creamos un bloque de entorno a través de la CreateEnvironmentBlock() La API.El problema es que CreateEnvironmentBlock(), utilizando el token del usuario de la sesión de la aplicación, crea un bloque con ProgramW6432="C:\Program Files (x86)", que es un problema para las aplicaciones de 64 bits.Tenemos que reemplazar con el valor correcto.

¿Fue útil?

Solución

Como se ha mencionado, el uso de SHGetKnownFolderPath desde una aplicación de 32 bits no funcionarán en un sistema operativo de 64 bits. Esto se debe a la emulación WOW64 está en vigor.

Sin embargo, puede utilizar RegOpenKeyEx pasando KEY_WOW64_64KEY la bandera y luego leer el directorio de archivos de programa de registro.

La ubicación de registro:

  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion

Usted está interesado en el valor de cadena:

  

ProgramFilesDir

Otros consejos

Si usted lee esa página cuidadosamente verá que FOLDERID_ProgramFilesX64 es compatible con 32 bits aplicaciones en un sistema operativo de 64 bits. No es compatible en un sistema operativo de 32 bits, lo que tiene sentido completo.

  

FOLDERID_ProgramFilesX64 es compatible ...

MSDN dice que es compatible, pero el documento "WOW64" las mejores prácticas de Microsoft dice que no lo es. Ver http: // download .microsoft.com / descarga / A / F / 7 / AF7777E5-7DCD-4800-8A0A-B18336565F5B / wow64_bestprac.docx

Para la cita:

  

• Algunas variables funcionan sólo si el proceso es de 64 bits.   Por ejemplo, FOLDERID_ProgramFilesX64 no funciona para las llamadas de 32 bits. En las versiones de Windows anteriores a Windows 7,% ProgramW6432% no funcionó en el contexto de procesos de 32 bits. Una aplicación debe determinar si se está ejecutando en un proceso de 64 bits antes de que utiliza estas variables.

En Windows 7 x64, correr una aplicación de 32 bits en el depurador de Visual Studio, que podrán disfrutar de un código de retorno de 0x80070002 (y un puntero NULL). Correr el mismo código compilado como de 64 bits devuelve el valor de S OK y el camino está correctamente cumplimentado.

He utilizado el corte del registro que se enumeran más arriba ya que no puedo encontrar ninguna otra solución.

También puede consultar la variable de entorno ProgramW6432.Obviamente sólo existe en la versión de 64 bits de Windows, pero debe devolver el real de 64 bits directorio de Archivos de Programa, y parece ser definidos para 64 bits y de 32 bits de programas.Al menos a mí me funcionó (C#, GetEnvironmentVariable)...

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