2012-03-29 12 views
0

私は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 ") 
+0

ChoosePixelFormatの呼び出しはどこですか? – datenwolf

+0

私はこれを元の質問に付けました。 –

答えて

0

アンOpenGLコンテキストは、加速されていない(何年かバックケースだったこと、少なくとも、私は私が間違っている可能性が、それは、変わったの疑い)。ハードウェアアクセラレーションによるレンダリングを行う場合は、ウィンドウを作成し、それを使用してGLコンテキストを生成します。必要に応じて、ウィンドウを非表示にします。

+0

私はシステムを近代化することを実際に担当しています(実際のハードウェアアクセラレーションでJavaの書き換えになります)。しかし、それが完了するまで古いバージョンを維持することも担当しています。 したがって、このバージョンを高速化することについて心配する必要はありません。今のようにクラッシュすることはありません。 私が読むほど、クラッシュはグラフィックスドライバの問題のように聞こえます(gdi32.dllとopengl32.dllについてよく聞きました。 –

+0

確かに。私はあなたがそれを維持しなければならないことを羨ましくない。私たちはまだ仕事でサポートしているVB6アプリを持っています。そして幸運にも私はそのための男ではありません:-)。それでも、あなたの問題に対する解決策は、コンテキストを取得するための目に見えないウィンドウを作成し、それをレンダリングしてバックバッファからビットを取得することです。私はそれが膨大な量のコードになるとは思わないはずです。 – Robinson

+0

@Robinson:何か有用なものをもたらすためのレンダリング用の隠しウィンドウでは、Framebufferオブジェクトを使用するか、そのウィンドウをPBufferのプロキシとして使用する必要があります。 – datenwolf

関連する問題