首先EXE程序是32位,DelphiIDE对Project默认是启用主题的,默认情况在WIN64 OS下运行时,无管理员权限。
WIN64 OS,默认情况下UAC是启用的。
上述默认情况下,EXE 是无法写注册表HKEY_LOCAL_MACHINE\Software的,OpenKey 返回False(既然启用了主题,但是未要求管理员权限,那Windows就假定该程序不需要写注册表)。
如果禁用IDE的主题选项,OpenKey返回True(可能是以前win9x的老程序,因为没有manifest文件来判断,所以返回true),但是后面实际写时,会提示出错
---------------------------
Project1
---------------------------
Failed to set data for 'ConsentPromptBehaviorAdmin'
---------------------------
确定
---------------------------
EXE加 XPManifestUAC.manifest 资源,再次编译,就会自动有盾牌,有管理员权限。
如果在IDE里2种方式运行,都会显示
---------------------------
Error
---------------------------
Unable to create process: 请求的操作需要提升。.
---------------------------
OK
---------------------------
如果在 文件夹窗口运行,就是显示提升对话框,提升以后。
然后以with TRegistry.Create do 写注册表成功,但是写的PATH会 重定向到Wow6432Node下。
如果code再改一下, 用
with TRegistry.Create(KEY_WOW64_64KEY or KEY_ALL_ACCESS) do 红色的是必须的,只有前面的是不行的,否则OpenKey返回False。
就能写到 PATH 对应的位置,Windows7根据情况自动确定Wow6432Node下是否同步相应的值。
如果32位的EXE自己要 读、写注册表保存软件自身的设置,一般自动重定向到Wow6432Node也没有什么问题。
如果32位的EXE要读、写到64PATH,那才需要KEY_WOW64_64KEY 。
http://blog.csdn.net/xiexuan2007/article/details/38416123
http://www.xuebuyuan.com/809036.html
http://blog.csdn.net/educast/article/details/10168621
http://www.bccsafe.com/?p=634
另外,文件虚拟化
1、Windows7兼容的程序(带manifest文件或者启用主题,但是以标准用户权限运行),比如自带的记事本,保存文件到Windows 目录C:\windows,会提示
你没有权限在此位置保存文件。
请与管理员联系以取得相应权限。
你想改为保存到 我的文档 文件夹中吗?
这时,虚拟化技术并未生效。
2、WindowsXP下的notepad.exe,复制到Windows7运行,也保存到Windows目录
能成功保存,没有任何提示信息。
这时,虚拟化技术起作用了。其实文件是被保存到了 用户配置文件夹下 AppData-Local——VirsualStore-原来准备保存的文件夹Windows。
3、Windows7兼容的程序(以管理员权限运行,manifest文件里要求RunAsAdministrtor),则,可以保存数据到 Windows目录。