(从大卫赫弗南试图建议后更新)当心的Windows 8.1注册表中读取虚拟化并不适用于64位应用程序
我有一个传统的Win32本机应用程序(德尔福6)该HKEY_LOCAL_MACHINE下写入值注册表\ Software \\键。这些值稍后将被几个其他传统Win32本机应用程序和一个新的.NET应用程序读取。 .NET应用程序构建AnyCPU,因此以64位图像的形式执行。因为它使用32位应用程序编写的配置,.NET软件将其注册表读取重定向到Win32 API应用程序实际写入的Wow6432Node。
没有任何应用程序正在运行提升。 所有应用程序都是交互式的。 用于运行应用程序的帐户具有对HKEY_LOCAL_MACHINE \ Software \\注册表项及其子项的明确“完全控制”。
据我所知,这不是使用注册表虚拟化,因为32位应用程序有写访问他们写到HKLM键。
此方案在64位Windows 7和64位Windows 8计算机上工作得很好,但在新的Windows 8.1 64位计算机上都不工作。
虽然传统的Win32应用程序写入注册表没有错误,它现在似乎正在虚拟化。这可以通过查看用户虚拟化注册表项来确认;我看到里面所有的书面价值。
当我使用REGEDIT查看HKEY_LOCAL_MACHINE \ Software \\键时,我写的大约一半的键只是从HKEY_LOCAL_MACHINE \ Software \\中丢失,但都存在于虚拟化文件夹中。
据我所知,它与32位应用程序写权限应该没有虚拟化,但有。更糟的是,当我读取非虚拟化密钥时,我看到一些但并非全部写入虚拟化商店的值。
为什么它突然虚拟化写入,为什么当读取原始密钥(即虚拟读取未按预期工作)时读取不显示所有虚拟值?
我认为这必须是一个权限问题,就好像我运行应用程序“作为管理员”的关键都在那里。然而,运行提升不是允许的最终配置。
更新
我清理了这台机器上的所有注册表设置。无论是HKCU下的虚拟商店还是HKLM下的共享区域。然后再次开始,没有升高。这导致了类似的症状,但是这次我只能看到HKLM密钥中的一个密钥。
我的打算写一个Win32应用程序来枚举HKEY_LOCAL_MACHINE \ SOFTWARE \\键的情况下,我正被一些REGEDIT.EXE所愚弄,或者在64位操作系统上运行,并且会更新时,是不是做对我来说我有结果。得到它与传统的32位WinAPI应用程序和新的64位应用程序之间的虚拟化不匹配。详情请参阅我的回答。
如果我有任何选择,我不会使用它,但发展需要时间和成本的钱,现在有一点爱花钱来修复“工作”的传统应用程序。 –
我会尝试一下这个建议(我们的Windows 8 64位机器上的一切看起来都很好),看看它是否会将事情排序。 –
事情是不行的。只要有人跑高架,一个扳手就会投入工作。您只需写信给HKCU而不是HKLM即可。 –