
My function in Haskell takes a CString and returns a ByteString (of Word8). I tried to put this function in a Haskell made Windows dll. I want to use this function in a program written in C. The most simple program that compiled was: Import qualified B.ByteString as B import Foreign.StablePtr import Foreign.C.String import Foreign.Ptr foreign export stdcall parseRuitType :: CString -> IO (Ptr ()) parseRuitType s = do p <- (newStablePtr ( B.pack [10,11,12])) return $ castStablePtrToPtr p For testing I ignore s. In the C-program : hs_init(NULL,NULL) res = parseRuitType ("5" ) No errors, but the returned value res (or the dereferenced res) makes no sense (not 10,11,12). My idea was: the result of the function(a ByteString of Word8) must be locked. No garbage collection. But newStablePtr does not return a pointer. So I have to convert the newStablePtr to a real pointer and then coerce this in the C program to a pointer to a array of word8.? I've tried to return the ByteString in the Haskell function. But now the compiler complains: Unacceptable result type in foreign declaration : B.ByteString I'am missing the big picture. Any ideas? Greetings Kees
participants (1)
-
Kees Bleijenberg