问题是这样的:
前几天我遇到的:
我编译好的程序在某台机子出现经常性崩溃的错误。具体就是点击一下鼠标转动3维视图就经常出错,错误窗口显示是
AppName: MyProgram.exe AppVer: 1.2.1.0 ModName: nvoglnt.dll
ModVer: 6.14.11.7813 Offset: 00121fad
显卡为NVIDIA GeForce 9400 GT.
现在定位到Ondraw中的wglMakeCurrent(m_pDC->GetSafeHdc(), NULL)这句话出错,如果我不用这句话就没问题,但我程序一定要用多文档。
请问是我的程序调用有问题还是opengl多文档程序在新型的Nvidia上都有类似问题?
请问如何改正?
多谢!

解决方案 »

  1.   

    估计是新卡中驱动中的Ogl库比较新,对你的用老Ogl库写的程序不支持
      

  2.   

    单独看看m_pDC->GetSafeHdc(), 
    句柄是不是取来了?
      

  3.   

    不是句柄的问题,在这句话前面加:
    if(!m_pDC)
    {
       AfxMessageBox(_T("Error DC"));
       return FALSE;
    }
    ::wglMakeCurrent(m_pDC->GetSafeHdc(), NULL);
    结果发现崩溃前没有弹出对话框
      

  4.   

    OnDraw()
    {
    在每次开始绘制时:
        HGLRC               hglrc_old = wglGetCurrentContext ();
        HDC                 hdc_old   = wglGetCurrentDC ();
        HDC                 hdc       = 当前DC;
        HGLRC               hglrc     = wglCreateContext (hdc);    if ( !hglrc || !wglMakeCurrent (hdc, hglrc) )
          {
            errorcode = glGetError ();
            printf ( "wglMakeCurrent failed: %d %s\n", errorcode, gluErrorString(errorcode) );
            return;
          }
    // 执行绘制代码绘制完场景后:
        wglMakeCurrent ( hdc_old, hglrc_old );
        wglDeleteContext ( hglrc );
    }
    或者每次开始绘制前,将RC和DC设为本视图类的RC和DC,绘制完成后将RC和DC都设为NULL。为每个视图类创建一个RC,程序中实际只有一个RC,但多视图需要切换RC和对应的DC。
      

  5.   

    恩,我试试,我的确没有保存原来的DC和RC,我的做法是:void CTestView::OnDraw(CDC* pDC)
    {
     wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联
     myDrawScene( ); //具体的绘图函数,在 RC 中绘制
     SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而
     //在屏幕上显示
     wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图}
      

  6.   

    测试了还是不行,代码如下:void CNewView3DView::OnDraw(CDC* /*pDC*/)
    {
    HGLRC hglrc_old = wglGetCurrentContext();
    HDC hdc_old = wglGetCurrentDC();
    HGLRC hglrc = wglCreateContext(m_pDC->GetSafeHdc());
    if ( !wglMakeCurrent(m_pDC->GetSafeHdc(), hglrc) )
    {
    AfxMessageBox(_T("Error: wglMakeCurrent."));
    return;
    }
    ::SwapBuffers( m_pDC->GetSafeHdc() ); //CutOpenGLRenderContext();   //cut RC
    wglMakeCurrent(hdc_old, hglrc_old);
    wglDeleteContext(hglrc);
    }