私はVB6アプリケーションを維持するように任命されました。私はいくつかのOpenGLの経験を持っていますが、すべてSDLを使用していますが、これは手動ですべてのコンテキストを処理するようです。VB6のChoosePixelFormatでクラッシュする
ChoosePixelFormatを呼び出すと、プログラムがクラッシュするように見えます。私はnull以外のハンドルを渡しています。それはほとんどのシステムで動作するので、私はそのグラフィックスドライバの問題を推測していますが、最新のようです。
誰かがこの機能がエラーコードを返す代わりにクラッシュする理由を知っていますか?
.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
しかし、それは、それはクラッシュするだろう:私はPIXELFORMATDESCRIPTORが与えられたシステム上に存在しない値を持つことが理解できますか?
編集:これが失敗したシステムでは、このコードが同じ以前のバージョンで動作します。 opengl32.dllをロード/アンロードすると、gdi32.dllが問題を引き起こす可能性があると私はどこかでフォーラムを読んでいます。これは事実かもしれません。
編集:私は下の完全なコードを添付しました(これは一種のものですが、クラッシュがあった場所を絞り込むのに役立ちました)。 ChoosePixelFormatがクラッシュする前に、関数は0を返しません。あなたがソフトウェアレンダラを取得しますので、DIBに
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 ")
ChoosePixelFormatの呼び出しはどこですか? – datenwolf
私はこれを元の質問に付けました。 –