[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
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++
I found someone else having an issue here:
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
More information about the Haskell-Cafe