2014-05-12 158 views
4

我有一個Windows程序在Haskell(因此32位)。我想訪問註冊表的64位視圖。 Windows API說要使用RegOpenKeyEx,要麼使用KEY_WOW64_64KEY0x200)。 (我現在用的是standard Haskell bindings到Windows API來與Haskell的平臺)從Haskell訪問64位註冊表

在我的程序這最終是:

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,如事件堆棧中所示(以及綁定的錯誤消息)。

有什麼建議嗎?

謝謝!

+0

由於ghc 7.6.1也可以在Windows上以64位模式使用Haskell。 –

回答

5

alternate registry view flags是:

KEY_WOW64_64KEY 0x0100 
KEY_WOW64_32KEY 0x0200 

但你寫道:

let kEY_WOW64_64KEY = 0x200 

所以你實際上是要求32位視圖。你需要寫:

let kEY_WOW64_64KEY = 0x100 
+0

現貨!這正是問題所在。謝謝。 – Tim

+0

對此答案中的細節留下深刻的印象。真正有用的共同編碼 – luqui