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

Brent Yorgey byorgey at seas.upenn.edu
Wed Jul 18 22:28:09 CEST 2012


I'm very glad to have been proven wrong about someone on the beginners
list being able to help. =)

On Wed, Jul 18, 2012 at 09:40:51PM +0200, Simon Peter Nicholls wrote:
> Wellllll, I couldn't wait until tomorrow of course.
> 
> I just had to have an after-dinner hack, tried again with WM_COPYDATA
> / COPYDATASTRUCT, and it worked first time!
> 
> Thanks again for your help!
> 
> On Wed, Jul 18, 2012 at 7:13 PM, Sylvain HENRY <hsyl20 at gmail.com> wrote:
> > 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
> >
> >
> >
> >
> > _______________________________________________
> > 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