使用Haskell的Excel Automation会产生seg错误

jin*_*ou2 51 com excel haskell ole

我可以使用以下脚本启动Excel.但是在ghci(7.4.1)中,当我运行它时会出现分段错误.

我不知道从哪里开始搜索.如果删除该行,我没有此错误

workSheets <- workBook #  propertyGet_0 "Worksheets"
Run Code Online (Sandbox Code Playgroud)

这是代码.可能是我忘记了什么.我在这里阅读了com.hs的源代码,但它没有给我任何线索.

import System.Win32.Com 
import System.Win32.Com.Automation
--
-- createObjectExcel 
-- coming from Automation.hs and com.hs
--

iidIDispatch_unsafe  = mkIID "{00020400-0000-0000-C000-000000000046}"

createObjExl :: IO (IDispatch ()) 
createObjExl = do
    clsidExcel <- clsidFromProgID "Excel.Application"
    pExl <- coCreateInstance clsidExcel  Nothing LocalProcess iidIDispatch_unsafe
    return pExl


fichierTest2 = "E:/Programmation/haskell/Com/qos1.xls"

main = coRun $ do 
    pExl <- createObjExl
    workBooks <- pExl #  propertyGet_0 "Workbooks"
    workBook <- workBooks #  propertyGet_1 "Open" fichierTest2
    workSheets <- workBook #  propertyGet_0 "Worksheets"

    workBooks # method_1_0 "Close" (0::Int)
    pExl # method_0_0 "Quit"

    mapM release [workSheets,workBook, workBooks, pExl]
Run Code Online (Sandbox Code Playgroud)

用Gonzalez的建议编辑我试过调试,但没有信息出现.我在ghci手工尝试了代码,似乎有罪的派对是释放功能.

当我在ghci中输入这些内容时,我得到了分段错误:

*Main> coInitialize
*Main> pExl <- createObjExl
*Main> release pExl
0
Run Code Online (Sandbox Code Playgroud)

现在,如果我点击"pExl",我有一个参考.不应该设置为Null吗?

*Main> pExl
<interface pointer = 0x020844cc>

*Main> coUnInitialize
*Main> :q
leaving Ghci
Segmentation Fault/access violation ...
Run Code Online (Sandbox Code Playgroud)

小智 1

您可能workSheets从静态函数中调用该方法。尝试将其移出。

或者,您是否尝试过明确声明“工作表”的数据类型

WorkSheets :: Int -> Int或(无论是什么类型都应该是)。