类的回调函数中生成新的类对象,并调用其函数,debug时出现assertion错误,release没有错误是什么原因,如何解决。
我现在想在回调函数中直接使用该对象,但回调函数只能是全局或静态的,不能使用非静态的变量和函数,有办法吗。
请赐教。
void COSDDlg::StartOneMilliSecondTimer()
{
if((TimerID_1ms =timeSetEvent(wTimerRes_1ms,wAccuracy,
(LPTIMECALLBACK) OneMilliSecondProc, // 回调函数; 
(DWORD)this,// 用户传送到回调函数的数据;
TIME_PERIODIC)) == 0)//周期调用定时处理函数;

AfxMessageBox(_T("不能进行定时!"), MB_OK | MB_ICONASTERISK); 

}void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,
DWORD dwl,DWORD dw2) 

COSDDlg *app=(COSDDlg*)dwUser;
app->test();
} void COSDDlg::test()
{
TextOut(MemDC,-k,0,osd_words,osd_words.GetLength());//CDC MemDC
}

解决方案 »

  1.   

    做成类的静态__stdcall 函数不行吗?
      

  2.   

    COSDDlg *app=(COSDDlg*)dwUser; 
    app->test(); 
    ++++++++++++++++++++++++++++++++
    这样出问题了?
      

  3.   

    COSDDlg *app = reinterpret_cast<COSDDlg*>dwUser; 
    app->test(); 这样试试
      

  4.   


    void PASCAL COSDDlg::OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser, //把这个静态函数声明在类中的静态函数,而且是public的
    DWORD dwl,DWORD dw2) 

    COSDDlg *app=(COSDDlg*)dwUser; 
    app->test(); 

    void PASCAL COSDDlg::OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2) 这样就好了
      

  5.   

    回调函数是自己编写由系统来调用的,所以无法向其传递参数,只能使用静态或全局变量。
    void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser, 
    DWORD dwl,DWORD dw2) 

    COSDDlg *app=(COSDDlg*)dwUser; 
    app->test(); 

    试问dwUser是如何传递进去的?这个强制转换根本得不到一个有效的COSDDlg类对象指针,执行时当然会出错了。
      

  6.   

    static void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dwl, DWORD_PTR dw2);
      

  7.   

    问题解决了,用的是SendMessage((HWND)dwUser,WM_SENDTIMER,0,0);通过消息机制,调用非静态资源。
      

  8.   

    保证dwUser是正确的窗口句柄,然后发送消息