今天在使用MFC消息传递函数时遇到一个问题,困了了半天,最终终于仍是找到了缘由。ios
先看看两个函数原型:web
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
二者的四个参数含义是同样的。
参数含义:
hWnd
:其窗口程序将接收消息的窗口的句柄。
Msg
:指定被发送的消息。
wParam
:指定附加的消息指定信息。
IParam
:指定附加的消息指定信息。svg
我使用这个消息的目的是,在消息发送过程当中,第三个参数wParam
须要带上我须要的消息,就是一串字符串。函数
我首先用的是PostMessage
,毕竟它不堵塞线程,不至于引发程序卡死,在使用过程当中,我发现一个问题,在我接收消息时,发现解析出来的参数始终是乱码,起初我一直觉得之强转致使的问题,但其实在我使用PostMessage
函数的函数中强转又是正常的。过程以下:测试
//发送消息 void NotifyRequstQuery(const std::string& body) { const char *cBody = body.c_str(); PostMessage(WM_MYMESSAGE_ONQUREY, (WPARAM)cBody, 0); } //接收消息 afx_msg LRESULT OnMyMessageOnqurey(WPARAM wParam, LPARAM lParam) { char *strBody = (char *)wParam; ..... return 0; }
在接收消息函数中解析不到我想要的消息时,觉得强转除了问题,因此我进行了以下测试:spa
void NotifyRequstQuery(const std::string& body) { const char *cBody = body.c_str(); WPARAM wParm = (WPARAM)cBody; const char *cResult = (const char *)wParm; z_pFrame->PostMessage(WM_MYMESSAGE_ONQUREY, (WPARAM)cBody, 0); }
这时发现其实强转回来,是没问题的。线程
这时我将PostMessage
函数更换为SendMessage
,这时发现接收消息函数接收到的参数正常。
本着思考的目的,查了不少二者间的区别,总结出来就是:前者不须要相应,直接返回;然后者必需要消息处理后才返回,不然处于线程等待。
那么到底是什么缘由致使这二者出现不一样的参数状况呢。
这时候想起会不会是变量使用周期引发的。
而后我又进行了以下测试:指针
void NotifyRequstQuery(const std::string& body) { //const char *cBody = body.c_str(); const char *cBody = "This is a Test." z_pFrame->PostMessage(WM_MYMESSAGE_ONQUREY, (WPARAM)cBody, 0); }
这是发现也能正常接收。很奇怪。但我如今不肯定这种使用方式 const 常指针变量会不会生命周期不同?
说实话,形参、常引用形参、常指针变量等等,这一些列烧脑玩意,不少人还真不必定不会出错,因而进行了以下测试:code
#include <iostream> std::string g_strTemp; //返回指向常变量的常指针 const char *TestStr1() { const char *cTemp = "This is TestStr1."; return cTemp; } //返回常引用形参赋值常指针 const char *TestStr2(const std::string &strTemp) { const char *cTemp = strTemp.c_str(); return cTemp; } //返回通常形参赋值常指针 const char *TestStr3(std::string strTmpe) { const char *cTemp = strTmpe.c_str(); return cTemp; } //局部变量传常变量实参 const char *TestStr4() { const char *cTemp = "********5555********"; return TestStr2(cTemp); } //全局变量传实参 const char *TestStr5() { g_strTemp = "********6666********"; return TestStr2(g_strTemp); } int main() { const char *cReturn1 = TestStr1(); std::cout << cReturn1 << std::endl; g_strTemp = "********1111********"; const char *cReturn2 = TestStr2(g_strTemp); std::cout << cReturn2 << std::endl; g_strTemp = "********2222********"; cReturn2 = TestStr3(g_strTemp); std::cout << "MAIN:" << cReturn2 << std::endl; std::string strBody = "********3333********"; const char *cReturn3 = TestStr2(strBody); std::cout << cReturn3 << std::endl; strBody = "********4444********"; cReturn3 = TestStr3(strBody); std::cout << cReturn3 << std::endl; const char *cReturn4 = TestStr4(); std::cout << cReturn4 << std::endl; const char *cReturn5 = TestStr5(); std::cout << cReturn5 << std::endl; system("pause"); return 0; }
运行结果如图:
经过结果咱们得出以下结论:xml
由此说明,问题出在调用NotifyRequstQuery
的地方,说明传入的实参有所改变,由于发消息
和接收消息
处于不一样的线程,因此说这彻底是可能存在的状况,由于PostMessage
不阻塞。
一、在调用NotifyRequstQuery
时传入的实参,定义为全局变量,但我的不推荐;
二、使用SendMessage
代替PostMessage
,但具体状况要根据实际而定。