Click here to Skip to main content
6,306,412 members and growing! (23,102 online)
Email Password   helpLost your password?
General Programming » String handling » General     Intermediate

Sending and posting CString to windows via PostMessage, SendMessage

By Matt Gullett

A robust mechanism for sending CString objects to windows within the current process.
VC6Win2K, MFC, Dev
Posted:1 Sep 2001
Views:82,528
Bookmarked:23 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
18 votes for this article.
Popularity: 5.36 Rating: 4.27 out of 5
2 votes, 16.7%
1

2
1 vote, 8.3%
3

4
9 votes, 75.0%
5

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

About the Author

Matt Gullett


Member

Occupation: Web Developer
Location: United States United States

Other popular String handling articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 18 of 18 (Total in Forum: 18) (Refresh)FirstPrevNext
GeneralMy vote of 1 PinmemberAlexandre GRANVAUD5:41 11 Dec '08  
GeneralThread Safety Pinmembersweetfa13:39 11 Jan '07  
GeneralWhy CString on heap for PostMessage?? Pinmemberjbem6:11 6 Feb '06  
GeneralRe: Why CString on heap for PostMessage?? PinmemberChris Meech6:43 6 Feb '06  
GeneralRe: Why CString on heap for PostMessage?? Pinmemberjbem19:43 6 Feb '06  
GeneralRe: Why CString on heap for PostMessage?? PinmvpCedric Moonen22:35 20 Mar '07  
GeneralThis worked great.... Pinsusswww.codeproject.com15:02 12 May '05  
Generalhow can i send message to Notepad? Pinmemberjags_vc19:27 28 Mar '05  
Generalwww.31show.com/ PinsussAnonymous2:23 18 Feb '05  
Generalhttp://www.31show.com/ PinsussAnonymous2:02 11 Dec '04  
GeneralHello Sir Little Doubt Using Send Message PinmemberThatsAlok21:37 26 Nov '04  
GeneralHow to send user defined structure using PostMessage? Pinmemberledallam19:21 13 Sep '04  
GeneralRe: How to send user defined structure using PostMessage? PinmemberThatsAlok21:17 26 Nov '04  
GeneralRe: How to send user defined structure using PostMessage? Pinmemberledallam17:51 30 Nov '04  
GeneralProblem... PinmemberRobJones6:15 26 Aug '04  
GeneralRe: Problem... PinmemberRobJones8:53 26 Aug '04  
Generalpostmessage problem Pinmemberpercyvimal19:11 25 Dec '03  
GeneralGreat job.. PinmemberRobJones9:55 11 Sep '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 1 Sep 2001
Editor: Smitha Vijayan
Copyright 2001 by Matt Gullett
Everything else Copyright © CodeProject, 1999-2009
Web12 | Advertise on the Code Project