Solved

string in LPARAM

Posted on 2003-11-26
15
1,771 Views
Last Modified: 2007-12-19
Hello

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
0
Comment
Question by:sk-man
  • 4
  • 3
  • 2
  • +4
15 Comments
 
LVL 13

Accepted Solution

by:
SteH earned 63 total points
ID: 9825361
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.
0
 

Author Comment

by:sk-man
ID: 9825503
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.
0
 
LVL 12

Expert Comment

by:andrewjb
ID: 9825596
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.
0
 

Author Comment

by:sk-man
ID: 9825635
OK, so I'll figure something else out.
0
 
LVL 13

Expert Comment

by:SteH
ID: 9825676
A CMemFile could be a solution. Since it is in memory it is fast and can be used across process boundaries.
0
 
LVL 86

Assisted Solution

by:jkr
jkr earned 62 total points
ID: 9825771
If you want to send strings, use 'WM_COPYDATA':

COPYDATASTRUCT cs;

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);
0
 
LVL 86

Expert Comment

by:jkr
ID: 9825791
0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 
LVL 11

Expert Comment

by:Agarici
ID: 9825828
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

A.
0
 
LVL 48

Expert Comment

by:AlexFM
ID: 9827067
0
 
LVL 9

Expert Comment

by:tinchos
ID: 10286116
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.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Tinchos
EE Cleanup Volunteer
0
 
LVL 86

Expert Comment

by:jkr
ID: 10286434
Um, actually "WM_COPYDATA" is the only way to send strings across process boundaries using windows messaging.
0
 
LVL 9

Expert Comment

by:tinchos
ID: 10286475
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.

Cheers

Tincho
0
 
LVL 86

Expert Comment

by:jkr
ID: 10286498
Hum, then, to be blunt: I *think* I was closest to the requested solution (using messaging)
0
 
LVL 13

Expert Comment

by:SteH
ID: 10288344
@jkr,
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.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

759 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now