Excel-automatisering met Haskell geeft een seg-fout

Ik kan Excel starten met het volgende script. Maar in ghci (7.4.1) heb ik een segmentatiefout wanneer ik het run.

Ik weet nu niet waar ik moet zoeken. Ik heb deze fout niet als ik de regel verwijder

workSheets <- workBook #  propertyGet_0 "Worksheets"

Hier is de code. Misschien ben ik iets vergeten. Ik heb de broncode van com.hs hiergelezen, maar het geeft me geen idee.

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]

Bewerkenop advies van Gonzalez Ik heb geprobeerd te debuggen, maar er kwam geen informatie naar voren. Ik probeerde de code met de hand in ghci, en het leek erop dat de schuldige partij de vrijgavefunctie was.

Toen ik deze invoerde in ghci, kreeg ik de segmentatiefout:

*Main> coInitialize
*Main> pExl <- createObjExl
*Main> release pExl
0

Als ik nu op “pExl” klik, heb ik een referentie. Moet dat niet op Null staan?

*Main> pExl
<interface pointer = 0x020844cc>
*Main> coUnInitialize
*Main> :q
leaving Ghci
Segmentation Fault/access violation ...

Antwoord 1, autoriteit 100%

Misschien roept u de methode workSheetsaan vanuit een statische functie. Probeer het te verplaatsen.

Of heb je geprobeerd het gegevenstype ‘Werkbladen’ expliciet aan te geven

WorkSheets :: Int -> Intof (wat voor type het ook is).

Other episodes