Click here to Skip to main content
15,888,351 members
Articles / Desktop Programming / MFC
Article

Sending and posting CString to windows via PostMessage, SendMessage

Rate me:
Please Sign up or sign in to vote.
4.89/5 (13 votes)
1 Sep 20013 min read 1.5M   2.7K   32   18
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


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 1 Pin
Alexandre GRANVAUD11-Dec-08 4:41
Alexandre GRANVAUD11-Dec-08 4:41 
GeneralThread Safety Pin
sweetfa11-Jan-07 12:39
sweetfa11-Jan-07 12:39 
QuestionWhy CString on heap for PostMessage?? Pin
montiee6-Feb-06 5:11
montiee6-Feb-06 5:11 
AnswerRe: Why CString on heap for PostMessage?? Pin
Chris Meech6-Feb-06 5:43
Chris Meech6-Feb-06 5:43 
GeneralRe: Why CString on heap for PostMessage?? Pin
montiee6-Feb-06 18:43
montiee6-Feb-06 18:43 
AnswerRe: Why CString on heap for PostMessage?? Pin
Cedric Moonen20-Mar-07 21:35
Cedric Moonen20-Mar-07 21:35 
GeneralThis worked great.... Pin
www.codeproject.com12-May-05 14:02
www.codeproject.com12-May-05 14:02 
Questionhow can i send message to Notepad? Pin
Jagdish Vasani28-Mar-05 18:27
Jagdish Vasani28-Mar-05 18:27 
Generalwww.31show.com/ Pin
Anonymous18-Feb-05 1:23
Anonymous18-Feb-05 1:23 
[URL=http://mms.sea123.com/x/1.htm]成人小说 成人论坛 成人电影[/URL]
[URL=http://mms.sea123.com/x/2.htm]成人 成人自拍 成人交友 成人网址[/URL]
[URL=http://mms.sea123.com/x/3.htm]色情图片 黄色小说 色情电影[/URL]
[URL=http://mms.sea123.com/x/4.htm]情色论坛 情色文学 情色贴图[/URL]
[URL=http://mms.sea123.com/x/5.htm]三级 三级片 三级电影 三级女郎[/URL]
[URL=http://mms.sea123.com/x/6.htm]色情论坛 黄色网址 色情网[/URL]
[URL=http://mms.sea123.com/x/7.htm]情色电影 偷窥图库 偷拍 偷拍网[/URL]
[URL=http://mms.sea123.com/x/8.htm]捆绑图片 免费同志电影 色情小说 同志电影[/URL]
[URL=http://mms.sea123.com/x/9.htm]色情图 激情自拍 大奶日本妹妹 激情[/URL]
[URL=http://mms.sea123.com/x/10.htm]封面女郎 三版女郎 床上戏 叫床声[/URL]
[URL=http://mms.sea123.com/x/11.htm]卖春 女优 裸体图片 美女裸体图片[/URL]
[URL=http://mms.sea123.com/x/12.htm]援助交际 做爱图片 做爱电影 春宫图片[/URL]
[URL=http://mms.sea123.com/x/13.htm]性感美眉 少女玉体 性爱知识 性感写真[/URL]
[URL=http://mms.sea123.com/x/14.htm]AV女郎 AV女优 性爱图片 美女性爱图片[/URL]
[URL=http://mms.sea123.com/x/15.htm]处女图 亚洲色情 自拍论坛 性爱网址[/URL]
[URL=http://mms.sea123.com/x/16.htm]春宫 春宫图 大奶写真 春宫画 a级电影[/URL]
[URL=http://mms.sea123.com/x/17.htm]色情图库 色情相片 免费色情电影 色情电影网站[/URL]
[URL=http://mms.sea123.com/x/18.htm]一夜情 一夜情网 一夜情网站 一夜情交友[/URL]
[URL=http://mms.sea123.com/x/19.htm]六合彩 6合彩 私彩 海南私彩[/URL]
[URL=http://mms.sea123.com/x/20.htm]六合彩网 六合彩论坛 私彩网 海南私彩网 海南私彩论坛[/URL]
[URL=http://mms.sea123.com/x/21.htm]美女论坛 美女图片论坛 美女诱惑论坛 日本美女论坛 欧美美女论坛[/URL]
[URL=http://mms.sea123.com/x/22.htm]美女图片 美女照片 美女图库 人造美女 美女游戏[/URL]
[URL=http://mms.sea123.com/x/23.htm]美女乱交照片 美女兽乱交图片 美女狗乱交图 美女电影[/URL]
[URL=http://mms.sea123.com/x/24.htm]强奸 强奸网 强奸相片 强奸图片 强奸电影 强奸美女 强奸学生妹妹 强奸小说[/URL]
[URL=http://mms.sea123.com/x/25.htm]美女网 动画美女 美女手机图片下载 动漫美女 美女乱交照片 美女兽乱交电影[/URL]
[URL=http://mms.sea123.com/x/26.htm]伦乱小说 乱伦小说 乱伦电影 刺激小说 特级电影 激情小电影[/URL]
[URL=http://mms.sea123.com/x/27.htm]限制级电影 限制级电影论坛 顶级电影在线播放 免费五级电影片 bt限制级电影 韩国限制级电影[/URL]
[URL=http://mms.sea123.com/x/28.htm]未满十八岁禁入电影 未满21岁禁入电影 禁播电影 十八岁禁入电影 中国禁播电影 世界禁播电影[/URL]
[URL=http://mms.sea123.com/x/29.htm]性交电影 性交小说 性交相片 性交图片 两性知识 性交注意事项[/URL]
[URL=http://mms.sea123.com/x/30.htm]高潮电影 高潮片段 高潮小说 进入高潮 达到高潮 色狼小说 色狼电影[/URL]
[URL=http://mms.sea123.com/x/31.htm]美女按摩 色情按摩女郎 按摩小姐 按摩女信息 按摩女做口活 白领丽人图片 白领丽人相片 白领交友 白领丽人做爱电影[/URL]
[URL=http://www.31show.com/]加长车 China Limousine[/URL]
[URL=http://www.31show.com/gd/]map[/URL]
[URL=http://www.31show.com/mms/]go[/URL]
[URL=http://www.31show.com/china/]go[/URL]
[URL=http://www.31show.com/chinb/]go[/URL]
[URL=http://www.31show.com/shop/]网上开店 网上商店 网上购物[/URL]
[URL=http://www.31show.com/flower/17/]鲜花速递 鲜花速递网 网上鲜花速递 国际鲜花速递[/URL]
[URL=http://www.31show.com/flower/18/]鲜花快递 鲜花快递网 网上鲜花快递 国际鲜花快递[/URL]
[URL=http://www.31show.com/flower/19/]礼品速递网 礼品快递网 生日鲜花[/URL]
[URL=http://www.31show.com/flower/20/]鲜花网 中国鲜花 鲜花礼品网 全国鲜花网[/URL]
[URL=http://www.31show.com/flower/21/]鲜花网站 鲜花速递网站 鲜花快递网站[/URL]
[URL=http://www.31show.com/flower/22/]鲜花订购 网上鲜花订购 怎样订购鲜花[/URL]
[URL=http://www.31show.com/flower/23/]鲜花礼仪 鲜花礼仪网 鲜花礼仪公司[/URL]
[URL=http://www.31show.com/flower/24/]鲜花配送 送鲜花 鲜花订送 订鲜花[/URL]
[URL=http://www.31show.com/flower/1/]送花 网上送花 异地送花 邮政送花 情人节送花[/URL]
[URL=http://www.31show.com/flower/2/]订花 订花网 网络订花 情人节订花[/URL]
[URL=http://www.31show.com/flower/3/]网上订花 情人节礼物 情人节礼品[/URL]
[URL=http://www.31show.com/flower/4/]送花服务[/URL]
[URL=http://www.31show.com/flower/5/]花 花店 花店送花 花店订花[/URL]
[URL=http://www.31show.com/flower/6/]鲜花礼品 商务礼品 时尚礼品 鲜花店 鲜花店送花 鲜花店订花[/URL]
[URL=http://www.31show.com/flower/7/]蛋糕 蛋糕店 送蛋糕[/URL]
[URL=http://www.31show.com/flower/8/]国际送花[/URL]
[URL=http://www.31show.com/flower/9/]网上花店 网上鲜花店[/URL]
Generalhttp://www.31show.com/ Pin
Anonymous11-Dec-04 1:02
Anonymous11-Dec-04 1:02 
GeneralHello Sir Little Doubt Using Send Message Pin
ThatsAlok26-Nov-04 20:37
ThatsAlok26-Nov-04 20:37 
QuestionHow to send user defined structure using PostMessage? Pin
ledallam13-Sep-04 18:21
ledallam13-Sep-04 18:21 
AnswerRe: How to send user defined structure using PostMessage? Pin
ThatsAlok26-Nov-04 20:17
ThatsAlok26-Nov-04 20:17 
GeneralRe: How to send user defined structure using PostMessage? Pin
ledallam30-Nov-04 16:51
ledallam30-Nov-04 16:51 
GeneralProblem... Pin
RobJones26-Aug-04 5:15
RobJones26-Aug-04 5:15 
GeneralRe: Problem... Pin
RobJones26-Aug-04 7:53
RobJones26-Aug-04 7:53 
Generalpostmessage problem Pin
percyvimal25-Dec-03 18:11
percyvimal25-Dec-03 18:11 
GeneralGreat job.. Pin
RobJones11-Sep-03 8:55
RobJones11-Sep-03 8:55 

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

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