关于SendMessage出错的问题

didacaopeng 2009-10-22 11:01:59
我的程序中用到SendMessage从一个视图类(CPaintview)向另一个视图类(CLeftView)中发消息,在CLeftView中作出响应。大概是按一下步骤实现的:
1.CPaintView中用以下代码实现发送消息:
CMainFrame *pFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd());
CLeftView *pView=(CLeftView*)pFrame->GetActiveView();
::SendMessage(pView->m_hWnd,WM_MY_01,0,0);
2.CLeftView中用以下代码实现相应:
.H文件中添加:
#define WM_MY_01 WM_USER+1

afx_msg void Analyze(WPARAM wParam, LPARAM lParam);
.CPP文件中添加:
ON_MESSAGE(WM_MY_02,Analyze);

void CLeftView::Analyze(WPARAM wParam, LPARAM lParam)
{
m_data_item=3;
…………
}
可以看到CLeftView已经做出响应,但是相应完毕之后,程序立刻报错“‘0x73d311c7’指令引用的‘0x00000004’内存。该内存不能为‘read’要终止程序~~~~~~”程序马上就关闭了。
哪位高手知道问题出在哪里的,请指教,如果问题说得不明比啊我再补充 谢谢~~~

...全文
632 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 whs1980 的回复:]
OnInitialUpdate();这是系统调用的虚函数,可能会出异常情况
你最好把更新的代码单独写成一个函数,在oninitialupdata()和你自己的函数里调用.
[/Quote]
还是不行啊~~·
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lonelyhacker 的回复:]
1.如果你的Debug版本中会提示那几个按钮出来,就是什么忽略和重试的啊几个按钮,

就代表你的代码肯定有问题,就算你忽略了也是有问题。

2.如果你的Debug出现这种问题,那你的Release版本出现的应该就是内存错误,然后关闭。
[/Quote]
我是这样想的:因为Debug下出的错误,都是在CPaintView类中重绘图形的时候所报的,用的是GDI绘图 我不是很熟悉,网上说这种错误可能是资源没有释放。但是在Release环境下可以看到CPaintView类中重绘过程已经完成了,CListView中也响应完操作了,在完成之后出的错误,关闭了程序。所以我觉的那些Debug报的错误不会影响太大 不知道我想的对不对~~~~请指正!
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuhudie203 的回复:]
运行第一次正常 第二次不行了?把你的Analyze函数全代码 方便的话贴一下
[/Quote]
void CPaintView::Analyze(WPARAM wParam, LPARAM lParam)
{
m_data_item=3;
OnPaint();
}

大概就是赋值 重绘啦
yayafu 2009-10-22
  • 打赏
  • 举报
回复
调试跟踪嘛,明显是指针访问错误,访问了空指针吧
dirdirdir3 2009-10-22
  • 打赏
  • 举报
回复
可能是你的analyze里面越界了还是用了野指针,和sendmessage关系不大............................
feiyangdn 2009-10-22
  • 打赏
  • 举报
回复
看看CLeftView是否初始化完成,可以不用消息传递,直接函数调用试试有没有问题。

CMainFrame *pFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd());
CLeftView *pView=(CLeftView*)pFrame->GetActiveView();
pView->Analyze();

另外确认指针,在CLeftView初始化过程中把this指针打印出来,和上面的pView做个比较,或者单步跟踪的时候观察一下。

didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 whs1980 的回复:]
OnInitialUpdate();这是系统调用的虚函数,可能会出异常情况
你最好把更新的代码单独写成一个函数,在oninitialupdata()和你自己的函数里调用.
[/Quote]
好的 我试试~~~~
lonelyhacker 2009-10-22
  • 打赏
  • 举报
回复
1.如果你的Debug版本中会提示那几个按钮出来,就是什么忽略和重试的啊几个按钮,

就代表你的代码肯定有问题,就算你忽略了也是有问题。

2.如果你的Debug出现这种问题,那你的Release版本出现的应该就是内存错误,然后关闭。
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
补充:
在Debug状态下 左边的CPaintView窗口(画图窗口)每次在重绘(程序打开的第一次不会出错)的时候都会报错:
Debug Assertion Failed!
~~~~~
File:wingdi.cpp
Line:1120
每次忽略过去就好了,估计是我在绘图时有资源没有释放~~但是应该不会影响到SendMessage;
关键:
程序在Debug下除了以上错误外不会出错,也不会关闭,只有在Release状态下出内存错误,然后关闭。
yuhudie203 2009-10-22
  • 打赏
  • 举报
回复
运行第一次正常 第二次不行了?把你的Analyze函数全代码 方便的话贴一下
whs1980 2009-10-22
  • 打赏
  • 举报
回复
OnInitialUpdate();这是系统调用的虚函数,可能会出异常情况
你最好把更新的代码单独写成一个函数,在oninitialupdata()和你自己的函数里调用.
whs1980 2009-10-22
  • 打赏
  • 举报
回复
把你"....."部分代码也贴出来
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
消息函数处理过程中是否出错... 检查是否变量析构等..
[/Quote]
m_data_item=3;
OnInitialUpdate(); 这是相应函数的过程,一个简单的函数 里面的断点我下在最后了 也没有问题
oyljerry 2009-10-22
  • 打赏
  • 举报
回复
消息函数处理过程中是否出错... 检查是否变量析构等..
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuhudie203 的回复:]
已经做出响应是何意?
是不是说明SendMessage已经发送成功?

给你个处理办法试试

用PostMessage试试 看报错不 如果和SendMessage一样 那么 在发送消息处打上断点
在你的消息响应函数里打上断点 看看断点跟到那块有问题

还有 你的消息是WM_MY_01 但是你的ON_MESSAGE(WM_MY_02,Analyze); 是WM_MY_02这是不是个问题呢
你看看是不是笔误
 
[/Quote]

不好意思 是我写错了 因为添加了多个消息 应该是WM_MY_01
做出相应了 就是CLeftView里面是个列表控件,我已经看到他刷新了,刚刷新完了,就报错了~~~
我也在Debug中下了间断点,程序运行到了:m_data_item=3;之后的语句也执行了,完了之后就不行了~~~
试过PostMessage了:

CSplitterWnd *ps = (CSplitterWnd *)GetParent();
CLeftView *pView = (CLeftView *)(ps->GetPane(0,0));
::PostMessage(pView->m_hWnd,WM_MY_01,0,0);
运行后第一次可以,很正常,但是要是再重复相同的操作,要其进行响应就会出错~~
yuhudie203 2009-10-22
  • 打赏
  • 举报
回复
已经做出响应是何意?
是不是说明SendMessage已经发送成功?

给你个处理办法试试

用PostMessage试试 看报错不 如果和SendMessage一样 那么 在发送消息处打上断点
在你的消息响应函数里打上断点 看看断点跟到那块有问题

还有 你的消息是WM_MY_01 但是你的ON_MESSAGE(WM_MY_02,Analyze); 是WM_MY_02 这是不是个问题呢
你看看是不是笔误
didacaopeng 2009-10-22
  • 打赏
  • 举报
回复
一步步找错误 发现是绘图部分的错误 谢谢各位了 存在的问题 另开贴再问了
didacaopengp 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lonelyhacker 的回复:]
1.如果你的Debug版本中会提示那几个按钮出来,就是什么忽略和重试的啊几个按钮,

就代表你的代码肯定有问题,就算你忽略了也是有问题。

2.如果你的Debug出现这种问题,那你的Release版本出现的应该就是内存错误,然后关闭。
[/Quote]

我之前说的那几个Debug Assertion Failed! 错误 是在以下的代码中出现的,就是在中间那句出现的,那句是为了获得切分窗口的第二个窗口的指针的。怎么获得呢~~~

CSplitterWnd split;
CPaintView * pView = (CPaintView*)split.GetPane(0,1);
pView->Analyze(0,0);
didacaopengp 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 feiyangdn 的回复:]
看看CLeftView是否初始化完成,可以不用消息传递,直接函数调用试试有没有问题。

CMainFrame  *pFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd()); 
CLeftView  *pView=(CLeftView*)pFrame->GetActiveView();
pView->Analyze();

另外确认指针,在CLeftView初始化过程中把this指针打印出来,和上面的pView做个比较,或者单步跟踪的时候观察一下。


[/Quote]

自己不能回帖了 换个号上来问
这位大侠说的,在CLeftView中可以实现,但是有这样的问题:
CLeftView和CPaintView是切分出来的两个视图的类,您给的程序中用的是GetActiveView()
每次默认的是CLeftView是激活的,所以要是CPaintView就不能用了,因为获得不到他的指针
我要是用一下的方法获得他的指针,程序就又会直接关闭

CSplitterWnd split;
CPaintView * pView = (CPaintView*)split.GetPane(0,1);
pView->Analyze(0,0);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧