c++ winapi windows-vista registry wow64

c++ - ¿Por qué RegOpenKeyEx() devuelve el código de error 2 en Vista 64 bits?



winapi windows-vista (5)

Descubrí que podía resolver mi problema usando la bandera: KEY_WOW64_64KEY , como en:

result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);

Para obtener una explicación completa: datos de aplicación de 32 y 64 bits en el registro

Estaba haciendo la siguiente llamada:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C ++, Visual Studio 5, Vista 64 bits).

Está fallando con el código de error 2 ("Archivo no encontrado") aunque " regedit " muestra que la clave existe. Este código siempre ha funcionado en 32bit XP. ¿Por qué es "archivo no encontrado" cuando claramente está allí?


En un sistema de Windows de 64 bits, el Registro en realidad está dividido en dos partes. Una sección es utilizada por procesos de 64 bits y procesos de una parte por 32 bits.

Por ejemplo, si una aplicación de 32 bits escribe programáticamente en lo que cree que es HKLM / SOFTWARE / Company / Application, en realidad es redirigida por WoW64-layer a HKLM / SOFTWARE / Wow6432Node / Company / Application.

Por lo tanto, cuando ejecuta su aplicación de 32 bits y llama a RegOpenKeyEx, en realidad está trabajando en contra de la carpeta Wow6432Node / y no del nodo regular / SOFTWARE.


Tienes que compilar con "Usar conjunto de caracteres de múltiples bytes" o canalizar cadena en el código para (LPWSTR)


Tuve un problema similar. Estaba usando:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPWSTR)"SOFTWARE//0test", 0, WRITE_DAC , &hKey);

Eso no funcionó. Lo intenté así y funcionó:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE//0test"), 0, WRITE_DAC , &hKey);