admin 管理员组

文章数量: 887032

 32位程序在64位Windows7/2008下写注册表不起作用问题

环境:
1.在Windows7/2008的64位操作系统
2.应用程序、安装程序均为32位

现象:
1.有一程序,要在资源管理器的右击时弹出菜单,并在菜单里显示一菜单项,如:复制、打开
2.用安装程序安装后,在右击菜单里未正常显示菜单项
3.用手工右击“.inf”文件,再点击“安装”的方式可以正常显示菜单项

原因分析:
1.有可能当前用户在注册表相关的访问权限不足
2.有可能64位操作系统对注册表有特殊的要求

问题解决过程:
1.查看注册表相关的键,发现这些键的权限对当前用户都可以正常读写。所以权限问题的可能性可以拔除
2.现在我们可以注意到用安装程序安装(即自动安装方式)是不成功的,但用手工右击“.inf”文件,再点击“安装”的方式(即手工安装方式)可以正常显示菜单项,是成功的。
妖异了!这二种方式存在哪些区别?
在Windows64位下,64位的应用程序和32位的应用程序都可以正常运行,操作系统同时提供二种环境,但这二种环境是有差异的。
首先、操作系统中存在二个目录:
C:\Windows\System32      这里存放32位的程序
C:\Windows\SysWOW64      这里存放64位的程序
当用手工方式执行64位程序或上述的安装“.inf”文件时,默认运行SysWOW64下的程序
当用自动方式执行32位程序时,默认运行System32下的程序
并且对应的注册表中的位置也不尽相同。
经查MSDN,有下列帮助对我们这个问题可以起关键作用:
RegCreateKeyEx()
RegOpenKeyEx()
函数的REGSAM相关的参数说明中提及:
KEY_WOW64_32KEY (0x0200) Indicates that an application on 64-bit Windows should operate on the 32-bit registry view. For more information, see Accessing an Alternate Registry View.
This flag must be combined using the OR operator with the other flags in this table that either query or access registry values.
Windows 2000:  This flag is not supported.

KEY_WOW64_64KEY (0x0100) Indicates that an application on 64-bit Windows should operate on the 64-bit registry view. For more information, see Accessing an Alternate Registry View.
This flag must be combined using the OR operator with the other flags in this table that either query or access registry values.
Windows 2000:  This flag is not supported.
从上文中,可以看出:32位的程序操作注册表实际操作的是\Software\WOW6432Node,而不是我们所希望的\Software
这就是我们苦苦寻找的问题所在。在我们的程序中,加上KEY_WOW64_64KEY标记符强迫读写注册表中\Software位置,问题得以解决。

本文标签: 注册表 不起作用 程序