Automatización de Excel con Haskell da una falla seg
com ole (1)
Puedo iniciar Excel con el siguiente script. Pero en ghci (7.4.1) tengo un error de segmentación cuando lo ejecuto.
No sé dónde buscar a partir de ahora. No tengo este error si elimino la línea
workSheets <- workBook # propertyGet_0 "Worksheets"
Aquí está el código. Puede ser que olvidé algo. Leí el código fuente de com.hs here , pero no me da ninguna pista.
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]
Edite con el consejo de Gonzalez. Probé la depuración, pero no surgió ninguna información. Probé el código a mano en ghci, y parecía que la parte culpable era la función de liberación.
Cuando ingresé estos en ghci, obtuve el error de segmentación:
*Main> coInitialize
*Main> pExl <- createObjExl
*Main> release pExl
0
Ahora si presiono "pExl" tengo una referencia. ¿No debería ser eso establecido en nulo?
*Main> pExl
<interface pointer = 0x020844cc>
*Main> coUnInitialize
*Main> :q
leaving Ghci
Segmentation Fault/access violation ...
Puede estar llamando al método workSheets
desde una función estática. Intenta moverlo.
O bien, ha intentado declarar explícitamente el tipo de datos de ''Hojas de trabajo''
WorkSheets :: Int -> Int
o (cualquier tipo debe ser).