热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用::PostMessage传递结构体,结果乱码?

先说明一下:要将一个结构体从CTestDlg传到CDetailDlg并显示相关内容,其中结构体如下structSMSG{CStringsName;CStringsIP;
说明一下:
要将一个结构体从CTestDlg传到CDetailDlg并显示相关内容,其中结构体如下
struct SMSG
{
CString sName;
CString sIP;
CString sContent[20];
int iNum;//计数
};
我的做法
先在TestDlg中定义SMSG msgs;并完善结构体的信息。然后按一个按钮,先生成一个非模态对话框DetailDlg,然后

::PostMessage(hWindow,WM_SHOWMSG,0,(LPARAM)&msgs);//hWindow是DetailDlg的句柄,且经检测,此时msgs中的内容是完好无损的

在DetailDlg.h中定义一个自定义消息,并添加处理函数
#define WM_SHOWMSG WM_USER+105
afx_msg void OnShowMsg(WPARAM wParam,LPARAM lParam);
ON_MESSAGE(WM_SHOWMSG,OnShowMsg)

void CDetailDlg::OnShowMsg(WPARAM wParam,LPARAM lParam)
{
SMSG* p=(SMSG*)&lParam;
m_strName=p->sName;
m_strIP=p->sIP;
m_iNum=p->iNum;//m_strName、m_strIP、m_iNum是3个编辑框关联的变量
for(int i=0;i {
m_str=p->sContent[i];
m_list.AddString(m_str);//将每条内容加到列表框
}
UpdateData(FALSE);
}

结果在DetailDlg里显示的内容都是乱码。。。怎么解决?

12 个解决方案

#1


看看是不是作用域的问题,因为postmessage是异步的,它会立马返回,如果在OnShowMsg中,你的那个东西已经超出其作用域了,就会出现这个问题,有的时候程序还会crash

#2


引用 1 楼 maoxing63570 的回复:
看看是不是作用域的问题,因为postmessage是异步的,它会立马返回,如果在OnShowMsg中,你的那个东西已经超出其作用域了,就会出现这个问题,有的时候程序还会crash
作用域是什么,怎么看?如果改成::SendMessage还是乱码

#3


结构体new 出来再传地址过去

#4


 SMSG* p=(SMSG*)&lParam;
改成 SMSG* p=(SMSG*)lParam;

#5


引用 3 楼 akirya 的回复:
结构体new 出来再传地址过去

不知道你说的是不是这样:
SMSG* msgs=new SMSG;
完善好信息后
::PostMessage(hWindow,WM_SHOWMSG,0,(LPARAM)msgs);//此时的msgs指向的内容也是完好无损的
但是结果还是乱码

#6


引用 4 楼 maoxing63570 的回复:
SMSG* p=(SMSG*)&lParam;
改成 SMSG* p=(SMSG*)lParam;

嘿嘿,这个不错。但是还是有个小问题,就是结构体中的CString sContent[20];会出现乱码,而且奇怪的是,最后一条不是乱码。比如说有5条内容,sContent[4],那么最后一条内容是完好的,前面4条就乱码了。

#7


引用 4 楼 maoxing63570 的回复:
SMSG* p=(SMSG*)&lParam;
改成 SMSG* p=(SMSG*)lParam;

也就是说运行会崩溃

for(int i=0;i     {
        m_str=p->sContent[i];//调试的时候,到这里就终止了,不能继续
        m_list.AddString(m_str);//将每条内容加到列表框
    }

#8


MSDN中关于PostMessage好像有个说法,也许和这个说明有关:
If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters  cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used.

#9


引用 8 楼 wltg2001 的回复:
MSDN中关于PostMessage好像有个说法,也许和这个说明有关:
If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message param……

。。这么严重,可是我的参数里面是地址,算不算指针?可是不传地址传什么呢?再说像4楼那样做已经差不多了。。。

#10


不建议PostMessage传递结构体,因为它是异步的,另外它还可能会失败,因为它走消息队列,当消息队列满了的时候就会失败。而SendMessage不走消息队列,直接Call窗口过程,所以你应该用SendMessage。

#11



好消息好消息,问题解决了,解决办法:
在4楼的基础上,把::PostMessage改成::SendMessage就行了,因为我看到8楼大哥提供的信息里没有说SendMessage会怎么怎么样,哈哈。。。我的思想被禁锢了,我总是认为SMSG* p=(SMSG*)&lParam;这里面是一定要有'&'的。。。先吃饭,回来结帖

#12


引用 10 楼 baby393 的回复:
不建议PostMessage传递结构体,因为它是异步的,另外它还可能会失败,因为它走消息队列,当消息队列满了的时候就会失败。而SendMessage不走消息队列,直接Call窗口过程,所以你应该用SendMessage。

恩恩,是的

推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
哈铁鸡西青年志愿者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有