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

Simon Peter Nicholls simon at mintsource.org
Wed Jul 18 18:22:28 CEST 2012

Cross-posted from Haskell-beginners. Apologies for not posting in the
right place (though I am a beginner and have probably made a simpleton

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.

UPDATE since prior posting:

Seems if I call out via FFI on the sending side, and set the WPARAM to
L"hardcoding FTW" in a wrapper C function, the SendMessage I then
invoke will work. The C code sees both the original string and the new
one, but only the second works when used.

I must be missing something obvious, but have toasted my grey cells at
this point!

More information about the Haskell-Cafe mailing list