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

Sylvain HENRY hsyl20 at gmail.com
Wed Jul 18 19:13:00 CEST 2012


If you are doing inter-process communication, you should not send 
pointers as processes do not share the same address space.

Use WM_COPYDATA to send a specific amount of data. 
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011%28v=vs.85%29.aspx

I've read that SendMessage is blocking, so you can use withCWString 
(contrary to what I have previously written). As you have to pass the 
size of the data, you can even use withCWStringLen (and peekCWStringLen).

Cheers
Sylvain

Le 18/07/2012 19:02, Simon Peter Nicholls a écrit :
> It's inter-process by design.
>
> I have a small "single instance " C++ program that I'm porting to
> Haskell. Once the first instance launched is up and running,
> subsequent launches send their command line params through to the
> single instance (file names). Similar to when a media player queues
> files in a play list.
>
> The most recent extra clue I have is that if I wrap the SendMessage
> function with my own C FFI version, my C function can both re-cast and
> output the CWString I have sent, and can successfully invoke the real
> SendMessage by overriding the CWString with a newly created L"blah"
> string. It's just a shame it can't use the original!
>
> My next session will involve poking around at the two strings to learn
> why they are treated differently.
>
> On Wed, Jul 18, 2012 at 6:33 PM, Sylvain HENRY <hsyl20 at gmail.com> wrote:
>> Are you sending the message to a window of the same process?
>>
>> -Sylvain
>>
>> Le 18/07/2012 18:28, Simon Peter Nicholls a écrit :
>>
>>> I've tried that without joy. Have reposted over at Haskell cafe, as
>>> per Brent's advice. Thanks to both of you.
>>>
>>> On Wed, Jul 18, 2012 at 5:56 PM, Sylvain HENRY <hsyl20 at gmail.com> wrote:
>>>> Hi,
>>>>
>>>> [As I've just registered to the list, I don't have the original message.
>>>> That's why I answer to Brent insted of Simon]
>>>>
>>>> By using "withCWString", your CWString may be freed before the message is
>>>> sent. Use "newCWString" instead and "free" in your receiving code.
>>>>
>>>> Cheers
>>>> Sylvain
>>>>
>>>> Le 18/07/2012 17:47, Brent Yorgey a écrit :
>>>>
>>>>> Hi,
>>>>>
>>>>> Just a meta-comment: this doesn't seem like a beginner question to
>>>>> me. =) Perhaps someone on this list will know the answer (and there's
>>>>> nothing wrong with asking), but for such a specific question you may
>>>>> have better luck posting to haskell-cafe or StackOverflow.
>>>>>
>>>>> -Brent
>>>>>
>>>>> On Wed, Jul 18, 2012 at 03:14:46PM +0200, Simon Peter Nicholls wrote:
>>>>>> 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 ::
>>>>>> System.Win32.Types.WPARAM
>>>>>>                    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.
>>>>>>
>>>>>> _______________________________________________
>>>>>> Beginners mailing list
>>>>>> Beginners at haskell.org
>>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>> _______________________________________________
>>>>> Beginners mailing list
>>>>> Beginners at haskell.org
>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Beginners mailing list
>>>> Beginners at haskell.org
>>>> http://www.haskell.org/mailman/listinfo/beginners
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners





More information about the Beginners mailing list