none
Vista上のAcitveXコントロールでのDirectX9利用の描画 RRS feed

  • 質問

  • VC++ 6.0 と DirectX9.0b にてAcitveXコントロールを作成しています。

    OnDraw 関数にて下記のように描画処理を行っています(主要部分のみ抜粋)。
    このコントロールを WindowsXP上で実行した場合には正しく描画されますが、
    WindowsVista上で実行した場合には、正しく描画されません。
    (表示領域が真っ黒になったり、ディスプレイドライバが停止したりします)

    対応方法などお分かりになりましたら、お教えください。
    よろしくお願いいたします。

     

    void CXXXCtrl:: OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {

     

    LPDIRECT3DSURFACE9 pSuf = NULL;

     

    HDC hdc = pdc->GetSafeHdc();

     

    hr = m_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSuf);
    hr = pSuf->GetDC(&hdc); 

     

    hr = Render();

     

    hr = pSuf->ReleaseDC(hdc);

     

    m_pd3dDevice->Present( NULL, NULL, NULL, NULL );

     

    }

    2008年5月14日 0:38

すべての返信

  • 抜き出されたコードにないだけかもしれませんが、pSurfってReleaseされていますか?

     

    #他にも問題があるかもしれませんが、まずは、さっと見て気になった点だけを。

    2008年5月14日 14:49
    モデレータ
  • Azuleanさん、ご返信ありがとうございます。

    pSuf は Present の後で Releaseしております(抜粋から抜けておりました。すみません)。

     

     

    2008年5月15日 1:00
  • Releaseはされていましたか、失礼しました。

    現状のコードだと、経験豊富と言えない私では手に負えません。

     

    他のPC(異なるハード構成)でも同様に問題が起きるのかどうかも含めて検証をしてみてはいかがでしょうか。

     

     

     TADAPOM さんからの引用

    HDC hdc = pdc->GetSafeHdc();

     

    hr = m_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSuf);
    hr = pSuf->GetDC(&hdc); 

    あと、気になったのですが、GetSafeHdcで取得したHDCって使われてないですよね…。

    IDirect3DSurface9::GetDCはout、つまりそこに入っている値は気にしないということとなっているので。

     

    http://msdn.microsoft.com/ja-jp/library/cc324043.aspx

    2008年5月15日 14:14
    モデレータ
  •  

    Azuleanさん、ご返信ありがとうございました。

    他のPCを借りて調査してみたところ、下記のような現象が見られました。

     

    1) グラフィックカードを搭載しない環境(Windows Vista Ultimate 32bit) 

     Present関数 → S_OK を返す

     

    2) nVidia系のグラフィックカードを搭載する環境(Windows Vista Ultimate 32bit) 

     Present関数 → 0xC0262111 を返す

                DXGetErrorString9 では "Unknown" とのこと。

     

    2) のリターンコードが手がかりになる気がするのですが、

    調べてもよく分かりませんでした。。。

     

     

    > あと、気になったのですが、GetSafeHdcで取得したHDCって使われてないですよね…。

    > IDirect3DSurface9::GetDCはout、つまりそこに入っている値は気にしないということとなっているので。

     

    なるほど。。。ご指摘の通りです。ありがとうございます。

    2008年6月2日 7:50
  •  TADAPOM さんからの引用

    2) nVidia系のグラフィックカードを搭載する環境(Windows Vista Ultimate 32bit) 

     Present関数 → 0xC0262111 を返す

                DXGetErrorString9 では "Unknown" とのこと。

    http://msdn.microsoft.com/en-us/library/cc231198.aspx

    ERROR_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATIONらしいです。

    文章を読む限り、「ロックされた領域は使用(レンダリング)できません」と見えましたが、ロジック中にロックの解放ができていないとかあるんでしょうか?(抜粋コードに本体部分がないので判断しかねます)

     

     

    2008年6月2日 14:23
    モデレータ