Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用delphi读取win注册表-firebird项失败_Delphi_Registry_Key_Firebird - Fatal编程技术网

使用delphi读取win注册表-firebird项失败

使用delphi读取win注册表-firebird项失败,delphi,registry,key,firebird,Delphi,Registry,Key,Firebird,我不明白。有一个firebird服务器的窗口注册表项,我想检查它是否存在。键存在,但函数返回false。 怎么了?我正在使用Windows764X和Delphi2010 Tks。 戴维斯 最可能的原因是您打开了请求写访问权限的密钥,但在UAC下的Windows 7上,默认情况下,用户没有对HKLM的写访问权限。通过将KEY\u READ传递到TRegistry构造函数,或者使用而不是OpenKey来解决此问题 下一个最可能的解释是您安装了64位Firebird服务器。但是您的32位程序从32位注

我不明白。有一个firebird服务器的窗口注册表项,我想检查它是否存在。键存在,但函数返回false。 怎么了?我正在使用Windows764X和Delphi2010

Tks。 戴维斯


最可能的原因是您打开了请求写访问权限的密钥,但在UAC下的Windows 7上,默认情况下,用户没有对
HKLM
的写访问权限。通过将
KEY\u READ
传递到
TRegistry
构造函数,或者使用而不是
OpenKey
来解决此问题

下一个最可能的解释是您安装了64位Firebird服务器。但是您的32位程序从32位注册表读取数据,因此无法从64位Firebird中找到密钥。有关两种不同注册表视图的详细信息,请参阅。有关如何从32位进程读取64位注册表的详细信息,请参阅。翻译成Delphi后,您需要在标志中包含
KEY\u WOW64\u 64KEY
。同样,您可以将此标志传递给可能更方便的
TRegistry
构造函数

总之,如果您正在寻找一个32位的服务器,请像下面这样创建registry对象

reg := TRegistry.Create(KEY_READ);
如果Firebird服务器是64位的,那么使用这个

reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
试着替换

TRegistry.Create


我认为,由于您是从64位操作系统上的32位进程来查看注册表,因此您实际上是在查看“虚拟”注册表树。事实上,一个隐藏的“子重定向”在这里起作用

请参阅Microsoft上的

在基于x64的计算机上运行的32位程序和64位程序 Windows版本以不同的模式运行,并使用以下功能 登记处各节:

本机模式64位程序以本机模式运行,访问密钥和 存储在以下注册表子项中的值:

HKEY_LOCAL_MACHINE\Software
HKEY_LOCAL_MACHINE\Software\WOW6432node
32位程序在WOW64模式下运行,访问 存储在以下注册表子项中:

HKEY_LOCAL_MACHINE\Software
HKEY_LOCAL_MACHINE\Software\WOW6432node
(引自上面的Microsoft页面)


因此,如果您的firebird进程以64位模式安装了密钥,那么它们在32位进程中将不可见。您还需要一个32位FireBird客户端来让它与Delphi一起工作(除非您使用的是Delphi XE2 64位模式)。

尝试以管理员身份运行应用程序。
我想这会解决你的问题。

相关-近似重复:和几乎完全重复:+1,但如果有一些解释,答案会有很大改进。没有这一点,问Q的人什么也学不到。我没有提到UAC等,因为OP没有说他感兴趣,他的代码样本也没有表明他想写注册表。我的示例表明,您可以设置是否要读/写,这将引导他朝着正确的方向前进。但是谢谢你的+1和建议,非常感谢!我真的不明白最后一句话在这里有什么关系。注册表项是服务器项。客户机在哪里处理事务?@DavidHeffernan我想强调的是,无论何时以32或64模式安装服务器,Delphi 32位应用程序都需要32位客户机库。如果注册表项是64位服务器项,则在这种情况下需要
key\u WOW64\u 64KEY
标志-这是您在编辑的答案中所述。我只是想解释为什么以及如何为运行在64位windows中的32位进程创建这种虚拟“密钥重定向”。