从Haskell访问64位注册表

Tim*_*Tim 4 registry winapi haskell

我在Haskell中有一个Windows程序(因此是32位).我想访问注册表的64位视图.Windows API说要使用RegOpenKeyExKEY_WOW64_64KEY(0x200)in ().(我使用Haskell平台附带的Windows API 的标准Haskell绑定.)

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

  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 -> ...
Run Code Online (Sandbox Code Playgroud)

但是,我得到了例外 RegOpenKeyEx: invalid argument (The system cannot find the file specified.)

检查Process Monitor中的调用显示以下输出: 在此输入图像描述

API调用不知何故最终丢弃了标志并进入Wow6432Node子树.还说明了,尽管事件暗示RegOpenKey我认为它实际上RegOpenKeyEx是在事件的堆栈(以及绑定的错误消息)中显示的.

有什么建议?

谢谢!

Dav*_*nan 5

备用注册表视图标志是:

KEY_WOW64_64KEY 0x0100  
KEY_WOW64_32KEY 0x0200  
Run Code Online (Sandbox Code Playgroud)

但你写道:

let kEY_WOW64_64KEY = 0x200
Run Code Online (Sandbox Code Playgroud)

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

let kEY_WOW64_64KEY = 0x100
Run Code Online (Sandbox Code Playgroud)