[Haskell-beginners] How do I marshall a pointer over SendMessage LPARAM or WPARAM?

Simon Peter Nicholls simon at mintsource.org
Wed Jul 18 15:14:46 CEST 2012

I'm new to Haskell, and have had some good success with FFI so far,
but using Win32's sendMessage to send a pointer in LPARAM or WPARAM is
resulting in access violations at the other end.

Is there some issue with my pointer conversions? Am I hitting some
restriction, or missing some compiler options?

 It's driving me pretty crazy, after a very nice start to using Haskell.

Some "sending" code:

            Foreign.C.String.withCWString "frustrator" $ \s -> do
                let wParam = System.Win32.Types.castPtrToUINT s ::
                Graphics.Win32.sendMessage wnd Graphics.Win32.wM_APP wParam 0

wndProc "receiving" code:

    | wmsg == Graphics.Win32.wM_APP = do
        s <- peekCWString $ System.Win32.Types.castUINTToPtr wParam
        putStrLn s
        return 0

The string will not be seen.

Some extra notes:

I can get wndProc messages and integral data generally.
The pointer values match textually at both ends when "shown" to stdout.
At the sending side I can pass the CWString to a regular FFI function
call just fine, and castUINTToPtr will give me back a functioning Ptr
for that call.

 I have also tried sending to & receiving from a working C++ program,
without success. Access violations are reported when receiving, though
again the address matches up. Silence from Haskell as before, when C++
is sending.

I found someone else having an issue here:
http://osdir.com/ml/haskell-cafe@haskell.org/2009-11/msg00731.html but
no solution unfortunately.

More information about the Beginners mailing list