I can fire up Excel with the following script. But in ghci (7.4.1) I have a segmentation fault when I run it.
I don't know where to search from now. I don't have this error if I remove the line
workSheets <- workBook # propertyGet_0 "Worksheets"
Here is the code. May be I forgot something. I read the source code of com.hs here, but it doesn't give me any clue.
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 with Gonzalez's advice I tried debugging, but no information arose. I tried the code by hand in ghci, and it seemed that the guilty party was the release function.
When I entered these in ghci, I got the segmentation fault:
*Main> coInitialize
*Main> pExl <- createObjExl
*Main> release pExl
0
Now if I hit "pExl" I have a reference. Shouldn't that be set to Null?
*Main> pExl
<interface pointer = 0x020844cc>
*Main> coUnInitialize
*Main> :q
leaving Ghci
Segmentation Fault/access violation ...
primInvokeMethod
which does all the raw memory operations. You can useghci
's debugging facilities to narrow down where in the source the segmentation fault triggers and what parameters cause it to fail. I don't have a windows machine, so I can't test it myself. – Gabriel Gonzalez Jan 26 '13 at 17:46