52

次のスクリプトで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]

ゴンザレスのアドバイスで編集してデバッグを試みましたが、情報が得られませんでした。ghciで手作業でコードを試してみたところ、リリース機能が有罪のようでした。

これらを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 ...
4

1 に答える 1

1

workSheets静的関数内からメソッドを呼び出している可能性があります。動かしてみてください。

または、「ワークシート」のデータ型を明示的に宣言しようとしましたか

WorkSheets :: Int -> Intまたは(どのようなタイプであるべきか)。

于 2015-01-01T04:45:32.487 に答える