从Haskell访问64位注册表

4
我有一个用Haskell编写的Windows程序(因此是32位),我想访问64位视图中的注册表。 Windows API要求使用RegOpenKeyEx并在其中加入KEY_WOW64_64KEY0x200)。 (我正在使用随Haskell平台提供的标准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: invalid argument (The system cannot find the file specified.) 在过程监视器中检查调用时,显示以下输出:enter image description here API调用不知何故会删除标志并进入Wow6432Node子树。同时,虽然事件暗示RegOpenKey,但我认为它实际上正在调用RegOpenKeyEx,如事件的堆栈(以及绑定的错误消息)所示。
有什么建议吗?
谢谢!

自从ghc 7.6.1版本以来,Windows上也可以使用Haskell的64位模式。 - Jeremy List
1个回答

5

备用注册表视图标志包括:

KEY_WOW64_64KEY 0x0100  
KEY_WOW64_32KEY 0x0200  

但是你写道:
let kEY_WOW64_64KEY = 0x200

所以您实际上是在寻求32位视图。您需要编写:

let kEY_WOW64_64KEY = 0x100

太准确了!这正是问题所在。谢谢。 - Tim
对这个答案中的细节关注印象深刻。真的很有帮助的编程。 - luqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接