在VB6中的ChoosePixelFormat期间崩溃

时间:2012-03-29 20:03:32

标签: windows opengl graphics vb6

我的任务是维护一个VB6应用程序;我有一些OpenGL经验,但都使用SDL,这个似乎手动处理它的所有上下文。

程序似乎在调用ChoosePixelFormat时崩溃。我正在传递一个非空句柄。它适用于大多数系统,所以我猜它是一个图形驱动程序问题,但它似乎是最新的。

有谁知道为什么这个函数会崩溃而不是返回错误代码?我理解PIXELFORMATDESCRIPTOR可能具有给定系统上不存在的值:

  .nSize = Len(glPFD)
  .nVersion = 1
  .dwFlags = PFD_DRAW_TO_BITMAP Or PFD_SUPPORT_OPENGL Or PFD_SUPPORT_GDI
  .iPixelType = PFD_TYPE_RGBA
  .cColorBits = 32
  .cDepthBits = 16
  .iLayerType = PFD_MAIN_PLANE

但这会让它崩溃吗?

编辑:在失败的系统上,它适用于此代码相同的先前版本。我读了一个论坛,说装载/卸载opengl32.dll会导致gdi32.dll破坏。情况可能就是这样。

编辑:我已经附上了下面的完整代码(它有点难看,但它帮助我缩小了崩溃的位置)。在ChoosePixelFormat崩溃之前,没有函数返回0。

hDCdib = CreateCompatibleDC(0) 'DC compatible with screen

Call MsgBox("Create Compatible DC " + CStr(hDCdib))


'Setup a Device Independent Bitmap Section
With bmInfo.bmiHeader
  .biSize = Len(bmInfo)
  If lngWidth = 0 Then
     .biHeight = objDest.ScaleY(objDest.Height, vbTwips, vbPixels)
     .biWidth = objDest.ScaleX(objDest.Width, vbTwips, vbPixels)
  Else
     .biHeight = objDest.ScaleY(lngHeight, vbTwips, vbPixels)
     .biWidth = objDest.ScaleX(lngWidth, vbTwips, vbPixels)
  End If

  .biPlanes = 1
  .biBitCount = 32
  .biCompression = BI_RGB 'No Compression
  .biSizeImage = 0
  .biClrImportant = 0
  .biClrUsed = 0
  .biXPelsPerMeter = 0
  .biYPelsPerMeter = 0
End With
Call MsgBox("after header")
hDIBSection = CreateDIBSection(hDCdib, bmInfo, DIB_RGB_COLORS, hBitMapData, _
              &O0, &O0)
Call MsgBox("CreateDIBSection" + CStr(hDIBSection))
'Select the DIB into a device context
hBitMapOld = SelectObject(hDCdib, hDIBSection)
Call MsgBox("SelectObject " + CStr(hBitMapOld))
'Create an OpenGL drawing area in that DIB
With glPFD
  .nSize = Len(glPFD)
  .nVersion = 1
  .dwFlags = PFD_DRAW_TO_BITMAP Or PFD_SUPPORT_OPENGL Or PFD_SUPPORT_GDI
  .iPixelType = PFD_TYPE_RGBA
  .cColorBits = 32
  .cDepthBits = 16
  .iLayerType = PFD_MAIN_PLANE
End With
Call MsgBox("glPFD ")
'Ignacio issue is in the next line about ChoosePixelFormat
lngFormat = ChoosePixelFormat(hDCdib, glPFD)
   Call MsgBox("ChoosePixelFormat " + CStr(lngFormat))
Htemp = SetPixelFormat(hDCdib, lngFormat, glPFD)
Call MsgBox("SetPixelFormat " + CStr(Htemp))
hGLrc = wglCreateContext(hDCdib)
Call MsgBox("wglCreateContext " + CStr(hGLrc))
wglMakeCurrent hDCdib, hGLrc
Call MsgBox("wglMakeCurrent ")

1 个答案:

答案 0 :(得分:0)

DIB上的OpenGL上下文没有加速,因此您将获得一个软件渲染器(至少在几年前就是这种情况,我怀疑它已经改变了,尽管我可能错了)。如果要进行硬件加速渲染,请创建一个窗口并使用它来生成GL上下文。如果需要,隐藏窗口。