Windows - Crash Under ChoosePixelFormat i VB6

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har fået til opgave at opretholde en VB6 app, jeg har fået nogle OpenGL-erfaringer, men alle bruger SDL, og denne synes at håndtere alle sine kontekster manuelt.


Programmet ser ud til at gå ned på et opkald til ChoosePixelFormat. Jeg går forbi et non-null-håndtag. Det virker på de fleste systemer, så jeg gætter på et grafikdriverproblem, men det ser ud til at være opdateret.


Ved nogen, hvorfor denne funktion ville gå i stykker i stedet for at sige, at returnere en fejlkode? Jeg forstår, at PIXELFORMATDESCRIPTOR kan have værdier, der ikke findes på et givet system:


  .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


Men ville det få det til at kollidere?


Rediger: På det system, hvor dette mislykkes, fungerer det med en tidligere version, hvor denne kode var identisk. Jeg læste et forum et sted der sagde loading/losning opengl32.dll kan forårsage gdi32.dll at bryde ting. Det kan være tilfældet.


Rediger: Jeg har vedhæftet hele koden nedenfor (det er lidt grimt, men det hjalp mig med at indsnævre, hvor krasjet var). Ingen funktioner returnerer 0, før ChoosePixelFormat krasjer.


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 ")

Bedste reference


En OpenGL kontekst på en DIB er ikke accelereret, så du får en software renderer (i det mindste det var tilfældet nogle år tilbage, og jeg tvivler på, at det er ændret, selvom jeg kunne være forkert). Hvis du vil gøre hardware accelereret gengivelse, opret et vindue og brug det til at generere din GL kontekst. Hvis du vil, skal du skjule vinduet.