加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winapi – 从Haskell访问64位注册表

发布时间:2020-12-14 03:54:20 所属栏目:Windows 来源:网络整理
导读:我在 Haskell中有一个 Windows程序(因此是32位).我想访问注册表的64位视图. Windows API表示在KEY_WOW64_64KEY(0x200)中使用RegOpenKeyEx和OR. (我将 standard Haskell bindings用于Haskell平台附带的Windows API.) 在我的程序中,这最终是: import qualifie
我在 Haskell中有一个 Windows程序(因此是32位).我想访问注册表的64位视图. Windows API表示在KEY_WOW64_64KEY(0x200)中使用RegOpenKeyEx和OR. (我将 standard Haskell bindings用于Haskell平台附带的Windows API.)

在我的程序中,这最终是:

import qualified System.Win32.Registry as W32
  import qualified System.Win32.Types    as W32
  ...
      let kEY_WOW64_64KEY = 0x200 -- has no binding in the library currently
      let regSam = kEY_WOW64_64KEY .|. ... other flags
      bracket (W32.regOpenKeyEx rootCode kname regSam) W32.regCloseKey $k -> ...

但是,我得到异常RegOpenKeyEx:无效参数(系统找不到指定的文件.)

检查Process Monitor中的调用显示以下输出:

API调用以某种方式最终丢弃了标志并进入Wow6432Node子树.还说明了,尽管事件包含了RegOpenKey,我认为它实际上调用了RegOpenKeyEx,如事件的堆栈(以及绑定的错误消息)所示.

有什么建议?

谢谢!

解决方法

alternate registry view flags是:

KEY_WOW64_64KEY 0x0100  
KEY_WOW64_32KEY 0x0200

但你写道:

let kEY_WOW64_64KEY = 0x200

所以你实际上是在寻求32位视图.你需要写:

let kEY_WOW64_64KEY = 0x100

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读