【问题标题】:Excel Automation with Haskell gives a seg fault带有 Haskell 的 Excel 自动化给出了一个段错误
【发布时间】:2013-01-10 08:15:39
【问题描述】:

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

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

workSheets <- workBook #  propertyGet_0 "Worksheets"

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

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]

Edit 根据 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,它执行所有原始内存操作。您可以使用ghcidebugging facilities 来缩小源中分段错误触发的位置以及导致其失败的参数。我没有windows机器,所以无法自己测试。
  • 你可以在 GHC 中尝试(即编译)吗?
  • 它可以有效地与 GHC 配合使用。而且也不需要像“mapM release [workSheets,workBook, workBooks, pExl]”那样发布,因为它是垃圾收集的。 mkiid 中也有一个 pb。我将在 reddit 上发布一个完整的示例。
  • 在调用 Worksheets 方法之前,您是否实际测试过 workBook 不为空?这似乎是最明显的测试,因为如果它为空,我想你会得到你所看到的行为。
  • 主要原因是ghci是多线程的,com包调用了OleInitialize。 OleInitializes 指定单线程 COM 模型。我相信这是失败的主要原因。带有单线程标志的编译包应该可以正常工作。

标签: excel haskell com ole


【解决方案1】:

您可能正在从静态函数中调用workSheets 方法。试着把它移出来。

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

WorkSheets :: Int -&gt; Int 或(应该是什么类型)。

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2022-11-10
    • 1970-01-01
    • 2020-01-31
    • 2019-09-09
    相关资源
    最近更新 更多