我可以使用以下脚本启动Excel。但是在ghci(7.4.1)中,当我运行它时,会出现分段错误。
我不知道该从哪里查找了。如果我删除该行,则不会出现此错误。
workSheets <- workBook # propertyGet_0 "Worksheets"
这里是代码。可能我忘记了什么。我在这里阅读了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]
在Gonzalez的建议下,我尝试进行调试,但没有发现任何信息。我在ghci中手动尝试了代码,似乎罪犯是release函数。
当我在ghci中输入这些内容时,我得到了段错误:
*Main> coInitialize
*Main> pExl <- createObjExl
*Main> release pExl
0
现在如果我按下“pExl”,我就有了一个引用。那么它不应该被设置为 Null 吗?
*Main> pExl
<interface pointer = 0x020844cc>
*Main> coUnInitialize
*Main> :q
leaving Ghci
Segmentation Fault/access violation ...
primInvokeMethod
,它执行所有原始内存操作。您可以使用ghci
的调试工具,缩小源代码中触发分段错误的位置以及导致失败的参数。我没有Windows机器,所以无法自行测试。 - Gabriella Gonzalez