[Haskell-cafe] Haskell DLL crashes Excel
lennart at augustsson.net
Mon Sep 25 08:55:10 EDT 2006
I don't think GHC is to blame in this case. If you follow all the
API (ABI) guidelines for building XLLs things work fine.
But there's a lot of things to get right.
On Sep 25, 2006, at 05:16 , Simon Peyton-Jones wrote:
> Andreas, Nikunj, and others
> I don't have any experience of using GHC to build XLLs, or getting VBA
> to call Haskell via a DLL. However, this is something we'd like to be
> easy and reliable using GHC. If any of you are experts on the VBA/DLL
> side of the question, and can figure out what we should do to make GHC
> do the Right Thing, we're all ears.
> Meanwhile, why not document whatever you learn (even if it's
> provisional) on the GHC wiki?
> That would help others.
> | -----Original Message-----
> | From: haskell-cafe-bounces at haskell.org
> [mailto:haskell-cafe-bounces at haskell.org] On Behalf Of
> | Andreas Marth
> | Sent: 22 September 2006 10:21
> | To: haskell-cafe at haskell.org
> | Subject: [Haskell-cafe] Haskell DLL crashes Excel
> | Hi everybody!
> | As you might now already know I try to let VBA call Haskell via a
> | function returns a String. Everything works fine now if I call the
> | only once. If I call it more often Excel crashes soon. Does any body
> | any idea what is going wrong or how I can find out. (I am a medium
> | Haskell user but no VBA programmer.)
> | My code for Haskell (Calculate.hs):
> | module Calculate where
> | import Foreign.C.String (CString, peekCString, newCString)
> | import Data.Word (Word8, Word16, Word32)
> | import Data.Bits (shiftR, (.&.))
> | import Foreign.Marshal.Array (newArray)
> | import Foreign.Ptr (Ptr, plusPtr)
> | type BSTR8 = Ptr Word8
> | createBSTR8 :: String -> IO BSTR8
> | createBSTR8 s = do
> | let
> | len :: Word32 = fromIntegral (length s)
> | low_l :: Word8 = fromIntegral (len .&. 0xFFFF)
> | low_h :: Word8 = fromIntegral (shiftR len 8 .&. 0xFFFF)
> | high_l :: Word8 = fromIntegral (shiftR len 16 .&. 0xFFFF)
> | high_h :: Word8 = fromIntegral (shiftR len 24 .&. 0xFFFF)
> | arr <- newArray ([low_l,low_h,high_l,high_h] ++ map
> (fromIntegral .
> | fromEnum) s ++ )
> | return $! plusPtr arr 4
> | testL :: Int -> CString -> IO BSTR8
> | testL n cs = do s <- peekCString cs
> | createBSTR8 $ concat $ take n $ repeat s
> | foreign export stdcall testL :: Int -> CString -> IO BSTR8
More information about the Haskell-Cafe