string in LPARAM


I Use PostMessage to broadcast a WindowsMessage. I want to post a string, but it seems like I can only post integers.

I try this:

char test[] = "abc";
PostMessage(HWND_BROADCAST, 49888, 2, test);             //Errormessage: cannot convert parameter 4 from 'char [4]' to 'LPARAM'

But it dowsnt work.

How do i send a string in the LPARAM?

Please help
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

You need to allocate space on the heap to be able to post the pointer:

char* test = new char[10];
strcpy (test, "abc");
PostMessage (..., (LPARAM) test);

and be sure to delete [] the memory in the handler of the message!

Caveat: this ony works inside a process. HWND_BROADCAST doesn't really make sence in that case. Outside the scope of the process the memory location is invisible.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
sk-manAuthor Commented:
Well now i don't get the error, but it still doesn't work.

I do this in a c++ dll:
char* test = new char[10];
strcpy (test, "abc");
PostMessage(HWND_BROADCAST, 49888, 2, (LPARAM)test);

In a C# form i have the WinProc function where i catch the message:
string test = m.LParam.ToString();

This gives me "60107080" which looks like a ptr. address to me.
It is a pointer address, and it's only valid within the same process as you post the message (as SteH said).

You can't pass strings over directly. You have to pass some form of handle or pointer, and have the string stored elsewhere.
Learn SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

sk-manAuthor Commented:
OK, so I'll figure something else out.
A CMemFile could be a solution. Since it is in memory it is fast and can be used across process boundaries.
If you want to send strings, use 'WM_COPYDATA':


ZeroMemory ( &cs, sizeof ( cs));

char test[] = "abc";
cs.cbData = strlen ( test);
cs.lpData = ( LPVOID) test;

SendMessage ( HWND_BROADCAST, WM_COPYDATA, <handle of your window>, (LPARAM) &cs);
BTW, see also on this issue.
you  can also look at this problem from this point of view: why pass the string to the other process? let the other process get the string when it nedds it. so you can simply export a function from your c++ dll that will get the desired string and call that function from c# form. if you want all processes to access the same value of the string, put it in a 'shared' section of your dll

No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Split: SteH {http:#9825676} & jkr {http:#9825791}

Please leave any comments here within the next seven days.

EE Cleanup Volunteer
Um, actually "WM_COPYDATA" is the only way to send strings across process boundaries using windows messaging.
Sorry jkr

Maybe I'm not quite familiar with this topic in particular, but I thought that Steh's comments should also be awarded some points.

However, mine is just a recommendation, post yours and moderators will decide when they come to close it.


Hum, then, to be blunt: I *think* I was closest to the requested solution (using messaging)
you are right. You gave the correct answer to the question. Mine could be at most interpreted as a hint how it can be solved in another way. Sometimes one is looking for a solution the way one is ued to. And one is not aware that there are other possiblities available.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.