首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

出错了.声名为 _stdcall 的函数调用消息函数时>>>>>>>>请问了.

2012-02-08 
出错了...声名为 __stdcall 的函数调用消息函数时请教了...源码:-------------------------protec

出错了...声名为 __stdcall 的函数调用消息函数时>>>>>>>>请教了...
源码:
-------------------------
protected:
      afx_msg   void   OnDraw();

......

ULONG   _stdcall   ThreadFunc(   LPVOID   lpParam   )
{
      .....
          CMy8344b_vcDlg::OnDraw();
      .....

}
-------------------------
错误提示:
...\8344_demo_vcDlg.cpp(226)   :   error   C2352:   'CMy8344b_vcDlg::OnDraw '   :   illegal   call   of   non-static   member   function
...\8344_vcdlg.h(46)   :   see   declaration   of   'OnDraw '

[解决办法]
ThreadFunc是static函数,不能直接调用CMy8344b_vcDlg::OnDraw();

一般做法是通过lpParam 传入实例,如
CMy8344b_vcDlg *pDlg = (CMy8344b_vcDlg*)lpParam;
if(pDlg) pDlg-> OnDraw();
[解决办法]
static函数和类的对象实际上是分开了,没有this指针,你这样直接调用是不行的。可以把CMy8344b_vcDlg对象的指针作为参数传给线程函数,不过微软不赞成这样做,MFC不是线程安全的。
[解决办法]
需要this指针,静态函数没有this指针。
[解决办法]
OnDraw不是静态函数,但你可以通过给CMy8344b_vcDlg发消息来实现
PostMessage或SendMessage
[解决办法]
呵呵,楼主应应该是被回调搞糊涂了。
否则的话,“CMy8344b_vcDlg::OnDraw();”这种代码写在一个全局函数中,一眼就能看出是不对的嘛。
[解决办法]
CMy8344b_vcDlg::OnDraw();
---------------------------
这种调用方法是静态的调用方法,而你的成员函数是非静态成员函数.
[解决办法]
你不应该在线程中直接访问其他线程创建的复杂MFC对象的成员函数。解决方法参考http://support.microsoft.com/kb/147578。

更新窗口可以用RedrawWindow函数。

热点排行