Re: [Haskell-cafe] ffi call works fine in ghci but not as ghc compiledsegfault

still no luck ;-( Everything works well under ghci but if I compile it with
ghc I get seg. fault
ghc version 7.6.3
I found out that when I load my ghci without any .o and .hi files ghci
function calls works fine. If I then compile my code with ghc and restart
my ghci (.o and .hi files now exists) the ghci crashes.
I have tried compiling with:
ghc -O --make Service.hs -L. -lmodel
ghc --make Service.hs -L. -lmodel
ghc -o service Service.hs -L. -lmodel
I have tried to call ffi function with:
setmodulestring1 param value = do
let param = cParamLength = fromIntegral $ length param ::CInt
cValueLength = fromIntegral $ length value ::CInt
setVarInArray = (-1)::CInt
B.useAsCString (B.pack "FilePath") $ \cParam -> do
B.useAsCString (B.pack "C:/dev/misc/haskell/services/FM") $ \cValue -> do
result <- c_setmodulestring cParam cParamLength cValue cValueLength
setVarInArray
return result
or with this:
setmodulestring :: String -> String -> IO CInt
setmodulestring param value = do
let param = "FilePath"
let value = "C:/dev/misc/haskell/services/FM"
cParam <- newCString param
cValue <- newCString 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 result
my main is:
main = do
let param = "FilePath"
let value = "C:/dev/misc/haskell/services/FM"
result <- liftIO $ FM.setmodulestring param value
return "done"
and still no luck - works in ghci and crashes as exe
interfacing the same library from a c++ code:
extern "C" int __stdcall setmodulestring(char* param,unsigned int length,
char* valuein,unsigned int valuelength,int index);
interfacing it from Haskell:
foreign import ccall "setmodulestring" c_setmodulestring :: CString
-> CInt -> CString -> CInt -> CInt -> IO CInt
please any ideas?
On Sat, Mar 15, 2014 at 4:48 PM, Miro Karpis
thank you very much so far and sorry for my not 100% understanding ;-). The dll is an external software - I have no control over it.
This is how I interface it from c++ program:
extern "C" int __stdcall setmodulestring(char* param,unsigned int length, char* valuein,unsigned int valuelength,int index);
And this is how I'm trying to interface it from Haskell (with the seg-fault):
foreign import ccall "setmodulestring" c_setmodulestring :: Ptr Char -> CInt -> Ptr Char -> CInt -> CInt -> IO CInt
m.
On Sat, Mar 15, 2014 at 3:32 AM, Brandon Allbery
wrote: On Fri, Mar 14, 2014 at 7:29 PM, Branimir Maksimovic < branimir.maksimovic@gmail.com> wrote:
You are passing wchar_t* and function expects char*.
FWIW they asked this before (possibly on a different list) and, absent the C information, I pointed out that Win32 API functions use CWString. This was apparently taken to mean that CWString was the only option....
Some awareness of one's platform conventions tends to be helpful when doing FFI. It seems to be absent here. :/
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
participants (1)
-
Miro Karpis