On 03/14/2014 11:24 PM, Miroslav Karpis wrote:
Hi, please can you help me with following?

I have a call to an external dll (via ffi) which if executed from ghci works fine. 
If I compile my code with 'ghc -o fm Mycode.hs -L. -lextdll' and run it I get  'Segmentation fault/access violation in generated code'.



main = do
let param = "FilePath"
let value = "C:/dev/misc/haskell/services/FM"
result <- liftIO $ FM.setmodulestring param value
return "done"

setmodulestring :: String -> String -> IO CInt
setmodulestring param value = do
let cParamLength = fromIntegral $ length param ::CInt
    cValueLength = fromIntegral $ length value ::CInt
    setVarInArray = (-1)::CInt
alloca $ \cParam -> do
alloca $ \cValue -> do
result <- c_setmodulestring cParam cParamLength cValue cValueLength setVarInArray
return result

This does not seems correct (or incomplete).

If I try also with following, the behaviour is the same:

setmodulestring2 :: String -> String -> IO CInt
setmodulestring2 param value = do
cParam <- newCWString param
cValue <- newCWString value
let cParamLength = fromIntegral $ length param ::CInt
   cValueLength = fromIntegral $ length value ::CInt
   setVarInArray = (-1)::CInt 
result <- c_setmodulestring cParam cParamLength cValue cValueLength setVarInArray
free cParam
free cValue
return res

This one may be correct but without, seeing C code (where it probably
segfaults) I cannot say anything further.
exact ffi declaration of c_setmodulestring would be usefull, too,
to compare with C function.