Click here to Skip to main content
Click here to Skip to main content

Sending and posting CString to windows via PostMessage, SendMessage

, 1 Sep 2001
Rate this:
Please Sign up or sign in to vote.
A robust mechanism for sending CString objects to windows within the current process.

Introduction

On occasions, I have needed to send a CString object to a window in my application via SendMessage or PostMessage (usually PostMessage). I have seen this particular question posted on the message boards several times, so I decided to post the code that I use to deal with this situation.

The Problem

The problem is that for whatever reason, you need to send a message to another window in your application and that message needs to include a CString object (passed via the WPARAM or LPARAM parameters). This is problematic because you must be careful to allocate the CString object on the heap (via the new operator), and you must take care to insure that the CString object is deleted when your application is finished with it. Not only this, but potential problems exist, such as accidentally sending the same message to the target window with no CString object passed in and various other situations.

The Solution

The solution is to use a CString derived class specifically designed to deal with this situation which deals with all of the issues involved in sending CStrings via Windows messaging. The solution involves 2 classes which work together to:

  1. Ensure that CString objects are only sent to windows within the current process (sending to other processes would cause unpredictable problems)
  2. Ensure that CString objects are properly cleaned up after they have been used
  3. Ensure that if the message does not make it to the intended target, that the CString object is not leaked
  4. Ensure that the receiving window does not process the message if the CString object is invalid.
  5. Avoid over-complicating the problem with global variables, CWinApp variables, etc.

The Implementation

I have created 2 classes CMessageString (derived from CString) and CMessageStringManager (not derived from any class). CMessageStringManager is not called directly by the program, it is managed as a protected static member of the CMessageString class.

CMessageString is a public derived class of CString which implements all of the currently defined constructors for CString (from MSDN). CMessageString has a protected static member of CMessageStringManager type. CMessageStringManager consists of a protected member CPtrList, an Add method, Delete method, ForceCleanup function and IsValid function. Each time a CMessageString is constructed, the Add method of CMessageStringManager is called to add the new CMessageString object into the CPtrList. When a CMessageString is destroyed, the Delete method is called to remove it from the CPtrList. When the app closes and the CMessageStringManager class is destroyed, it ensures that there are no CMessageString objects left in the list. If there are, it deletes them and if in debug mode, notifies the programmer through the TRACE macro.

CMessageString implements 5 public methods.

  1. SendAsWParam (HWND hwndTarget, UINT uiMessage, WPARAM wParam)
  2. SendAsLParam (HWND hwndTarget, UINT uiMessage, LPARAM lParam)
  3. PostAsWParam (HWND hwndTarget, UINT uiMessage, WPARAM wParam)
  4. PostAsLParam (HWND hwndTarget, UINT uiMessage, LPARAM lParam)
  5. static IsStringValid (CMessageString* pString)
  6. ForceCleanup ()

How to use these classes

I have included a simple demo project to show how this is used. In order to use these classes in your application, first add the 4 files to your project. To see how a CMessageString is sent, look in the CStringMessageDemoView class. To see how a CMessageString is received, look in the CMainFrame class.

First, include the messagestring.h file in your stdafx.h file (or some other appropriate file, I include it here because is makes it easy to use the class throughout my program).

TO SEND A CMessageString as a message

void SendAString()
{
    CMessageString* pString = new CMessageString;
    (*pString) = "bla.bla.bla";
    pString->PostAsWParam(hwnd, ID_SOME_MESSAGE, 0);
}

TO RECEIVE A CMessageString as a message

LRESULT CSomeWindow::OnStringMessage(WPARAM wParam, LPARAM lParam)
{
    // we expect the CMessageString in the WParam paramater
    CMessageString* pString = (CMessageString*)wParam;
       
    // make sure passed string is valid
    // (this is important to prevent unexpected
    // results if an invalid string is passed)
    if (CMessageString::IsStringValid(pString))
    {
        delete pString;
    }
    else
    {
        ASSERT(FALSE);
        return MESSAGESTRING_NOT_RECEIVED;
    }
    
    return 0;
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Matt Gullett
Web Developer
United States United States
No Biography provided

Comments and Discussions

 
GeneralMy vote of 1 PinmemberAlexandre GRANVAUD11-Dec-08 5:41 
GeneralThread Safety Pinmembersweetfa11-Jan-07 13:39 
QuestionWhy CString on heap for PostMessage?? Pinmemberjbem6-Feb-06 6:11 
Sorry if this is obvious but I've been trying to pass a CString from a thread via SendMessage (so the object doesn't go out of scope before being processed by a richedit control) and have had the program crash due to a corrupted CString object it seems. Anyway I went trolling and found this site. It's interesting that the first few lines specifically point out something I don't understand in relation to CString and using it to sendmessages, ie. "This is problematic because you must be careful to allocate the CString object on the heap (via the new operator)"...
 
Can anyone explain why I *must* allocate a CString object via the new operator on the heap and not on the stack when posting messages? I'll try allocating it on the heap and see if my problem goes away but I really would love to know the reasoning behind it.
 
I'm kind of new to threading if it isn't obvious. Based on the above info I think I might need to read up some more on it wrt the memory threads can access and scoping wrt other thread data etc..
 
Thanks!
 
-- modified at 11:16 Monday 6th February, 2006
AnswerRe: Why CString on heap for PostMessage?? PinmemberChris Meech6-Feb-06 6:43 
GeneralRe: Why CString on heap for PostMessage?? Pinmemberjbem6-Feb-06 19:43 
AnswerRe: Why CString on heap for PostMessage?? PinmvpCedric Moonen20-Mar-07 22:35 
GeneralThis worked great.... Pinsusswww.codeproject.com12-May-05 15:02 
Questionhow can i send message to Notepad? Pinmemberjags_vc28-Mar-05 19:27 
Generalwww.31show.com/ PinsussAnonymous18-Feb-05 2:23 
Generalhttp://www.31show.com/ PinsussAnonymous11-Dec-04 2:02 
GeneralHello Sir Little Doubt Using Send Message PinmemberThatsAlok26-Nov-04 21:37 
QuestionHow to send user defined structure using PostMessage? Pinmemberledallam13-Sep-04 19:21 
AnswerRe: How to send user defined structure using PostMessage? PinmemberThatsAlok26-Nov-04 21:17 
GeneralRe: How to send user defined structure using PostMessage? Pinmemberledallam30-Nov-04 17:51 
GeneralProblem... PinmemberRobJones26-Aug-04 6:15 
GeneralRe: Problem... PinmemberRobJones26-Aug-04 8:53 
Generalpostmessage problem Pinmemberpercyvimal25-Dec-03 19:11 
GeneralGreat job.. PinmemberRobJones11-Sep-03 9:55 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.1411023.1 | Last Updated 2 Sep 2001
Article Copyright 2001 by Matt Gullett
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid