rempl que programa program pasa files esta donde carpetas carpeta borro archivos c++ windows 64bit

c++ - que - ¿Cómo obtener la ruta de la carpeta Archivos de programa(no los Archivos de programa(x86)) del proceso WOW de 32 bits?



programa files x86 (6)

Estás en el camino correcto: utiliza el IDENTIFICADOR DE PÁGINA CONOCIDO de FOLDERID_ProgramFilesX64

La función SHGetKnownFolderPath se puede usar para recuperar la ruta completa de una KnownFolder determinada.

Necesito obtener la ruta al directorio de archivos de programa nativo (en lugar de WOW) desde un proceso WOW de 32 bits.

Cuando paso CSIDL_PROGRAM_FILES (o CSIDL_PROGRAM_FILESX86) a SHGetSpecialFolderPath, devuelve la ruta de la carpeta WOW (Archivos de programa (x86)).

Preferiría evitar el uso de una variable de entorno si es posible.

Quiero comparar algunos valores que leo del registro, si los valores apuntan a la ruta de la versión WOW o nativa de mi aplicación, entonces mi código hace algo, si no, hace algo más. Para averiguar dónde se espera que sean las versiones nativas y WOW de mi aplicación, necesito obtener las rutas a "Archivos de programa (x86)" y "Archivos de programa".


Esto es casi seguro que es una mala idea, según una publicación reciente del infame Raymond Chen. Mira aquí para más detalles. En pocas palabras, creo que se puede hacer, pero es un trabajo arduo y casi seguro que hay una manera más fácil.

Microsoft construyó la capa de emulación WOW para hacerte la vida más fácil. No pierdas todo tu tiempo y esfuerzo luchando contra él :-).

Quizás si nos dijo por qué necesita el directorio Archivos de programa que no son WOW, podríamos ayudarlo más.


Permítanme citar el excelente blog de Raymond Chen sobre el tema:

En Windows de 64 bits, los programas de 32 bits se ejecutan en una capa de emulación. Esta capa de emulación simula la arquitectura x86, virtualizando la CPU, el sistema de archivos, el registro, las variables de entorno, las funciones de información del sistema, todo eso. Si un programa de 32 bits intenta ver el sistema, verá un sistema de 32 bits. Por ejemplo, si el programa llama a la función GetSystemInfo para ver qué procesador se está ejecutando, se le informará que se está ejecutando en un procesador de 32 bits, con un espacio de direcciones de 32 bits, en un mundo con un cielo de 32 bits y 32 -bit pájaros en los árboles de 32 bits.

Y ese es el objetivo de la emulación: mantener feliz el programa de 32 bits simulando un entorno de ejecución de 32 bits.

...

La pregunta es "¿Cuál es la forma de encontrar el directorio de archivos de programa x64 desde una aplicación de 32 bits?"

La respuesta es " Es mejor trabajar con el sistema que en contra " . Si usted es un programa de 32 bits, entonces luchará contra el emulador cada vez que intente interactuar con el mundo exterior. En su lugar, simplemente recompile su instalador como un programa de 64 bits. Haga que el instalador de 32 bits detecte que se está ejecutando en un sistema de 64 bits y, en su lugar, ejecute el instalador de 64 bits. El instalador de 64 bits no se ejecutará en la capa de emulación de 32 bits, por lo que cuando intente copiar un archivo o actualizar una clave de registro, verá el verdadero sistema de archivos de 64 bits y el registro real de 64 bits.

Si aún desea hacer esto, le recomiendo leer los comentarios en esta entrada de blog ya que contienen algunos buenos consejos.


Lo necesitaba para obtener la Carpeta del Programa x64 de un Logonscript y usarla:

Dim oWshShell : Set oWshShell = CreateObject("WScript.Shell") Dim sProgramDirPath : sProgramDirPath = oWshShell.ExpandEnvironmentStrings("%ProgramW6432%") WScript.Echo sProgramDirPath


Agradezco toda la ayuda y, especialmente, las advertencias en este hilo. Sin embargo, realmente necesito este camino y así es como lo obtuve al final:

(Se eliminó la comprobación de errores para mayor claridad, se usa bajo su propio riesgo, etc.)

WCHAR szNativeProgramFilesFolder[MAX_PATH]; ExpandEnvironmentStrings(L"%ProgramW6432%", szNativeProgramFilesFolder, ARRAYSIZE(szNativeProgramFilesFolder);


La mejor y universal forma de obtener acceso a "Archivos de programa" es consultarlo desde el registro:

64-Bit-Process puede consultar: HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / ProgramFilesDir para obtener "C: / Archivos de programa" HKEY_LOCAL_MACHINE / SOFTWARE / Wow6432Node / Microsoft / Windows / CurrentVersion / ProgramFilesDir para obtener "C: / Archivos de programa ( x86) "

32-Bit-Process (Wow64) puede consultar: HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / ProgramFilesDir para obtener "C: / Archivos de programa (x86)" HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / ProgramFilesDir con la opción KEY_WOW64_64KEY ! para obtener "C: / Archivos de programa"

Pseudo-código:

OpenKey(hKey, HKEY_LOCAL_MACHINE, L"SOFTWARE//Microsoft//Windows//CurrentVersion", KEY_READ | KEY_WOW64_64KEY); QueryStringValue(hKey, L"ProgramFilesDir", sValue);