Winapi 从Haskell访问64位注册表
我在Haskell中有一个Windows程序(因此是32位的)。我想访问注册表的64位视图。Windows API要求使用Winapi 从Haskell访问64位注册表,winapi,haskell,registry,Winapi,Haskell,Registry,我在Haskell中有一个Windows程序(因此是32位的)。我想访问注册表的64位视图。Windows API要求使用RegOpenKeyEx和to或inKEY\u WOW64\u 64KEY(0x200)。(我使用的是Haskell平台附带的Windows API。) 在我的程序中,结果是: import qualified System.Win32.Registry as W32 import qualified System.Win32.Types as W32 ..
RegOpenKeyEx
和to或inKEY\u WOW64\u 64KEY
(0x200
)。(我使用的是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参数(系统找不到指定的文件)。
检查呼叫进程监视器显示以下输出:
该API调用以某种方式结束,丢弃了该标志并进入Wow6432Node
子树。还举例说明了,尽管事件暗指RegOpenKey
,但我认为它确实在调用RegOpenKeyEx
,如事件堆栈(以及绑定的错误消息)所示
有什么建议吗
谢谢 它们是:
但你写道:
let kEY_WOW64_64KEY = 0x200
因此,实际上您要求的是32位视图。你需要写:
let kEY_WOW64_64KEY = 0x100
完全正确这正是问题所在。谢谢。这个答案对细节的关注让人印象深刻。非常有用的共同编码自ghc 7.6.1以来,在Windows上以64位模式使用Haskell也是可能的。
let kEY_WOW64_64KEY = 0x100