2011-02-14 62 views
3

首先,一般情況...通過DLL加載的第三方庫確實會呈現爲HWND。這是簡單的2D渲染,並不直接使用D3D的方式,我可以看到 - 在DLL上的依賴關係走動顯示了很多D3DKMT函數,如D3DKMTCreateDevice,但不是像IDirect3D9::CreateDevice那樣的常規D3D調用。 當我打電話給IDirect3D9::CreateDevice時,第三方渲染變得棘手。它不會抱怨,只是將所有東西都渲染成黑色的矩形。我自己的渲染效果很好。初始化D3D9會導致第三方庫停止工作

細節...第三方DLL是Mozilla XULRunner 1.9.x,它是wxWidgets wxWebConnect庫中包裝的FireFox的核心(不具有硬件加速功能的2.0)。 wxWC加載XUL DLL並提供一個Web瀏覽器GUI組件。

我使用WX & wxWebConnect這裏工作程序,編譯EXE和代碼: http://www.kirix.com/forums/viewtopic.php?f=25&t=911#p2605

這裏是我的現實生活中的代碼,它稍微勢必wxWidgets的,但還不足以使其難以閱讀 - 我從一個隨機的窗口得到HWND只是初始化D3D,但從來沒有渲染它:

void MyFrame::OnD3DButton(wxCommandEvent &event) 
{ 
    static bool initialized = false; 
    static LPDIRECT3D9 mpD3D = NULL; 
    static LPDIRECT3DDEVICE9 mpD3DDevice=NULL; 
    if(!initialized) 
    { 
     wxButton *button=wxDynamicCast(event.GetEventObject(), wxButton); 
     HWND mHWnd = (HWND)button->GetHandle(); 
     mpD3D = Direct3DCreate9(D3D_SDK_VERSION); 

     D3DPRESENT_PARAMETERS md3dpp; 
     ZeroMemory(&md3dpp, sizeof(D3DPRESENT_PARAMETERS)); 
     md3dpp.Windowed     = true; 
     md3dpp.SwapEffect    = D3DSWAPEFFECT_DISCARD; 
     // triple buffer if VSync is on 
     md3dpp.BackBufferCount   = 1; 
     md3dpp.EnableAutoDepthStencil = 0; 
     md3dpp.hDeviceWindow   = mHWnd; 
     md3dpp.BackBufferWidth   = 0; 
     md3dpp.BackBufferHeight   = 0; 
     md3dpp.FullScreen_RefreshRateInHz = 0; 
     md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 
     md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
     md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 
     md3dpp.MultiSampleQuality = 0; 

     HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd, 
      D3DCREATE_MULTITHREADED|D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice); 
     if(FAILED(hr)) 
      wxMessageBox(wxString("mpD3D->CreateDevice() FAILED")); 
     else 
     { 
      wxMessageBox(wxString("mpD3D->CreateDevice() SUCCEEDED")); 
      initialized = true; 
     } 
    } 

} 

回答

5

問題可能是,除非您通過標記D3DCREATE_FPU_PRESERVE,否則CreateDevice將修改FPU狀態。當它咬我時,我花了很長時間才發現它。

1

你用相同的HWND像第三方DLL使用一個創建D3D設備?

在這種情況下,也許第三方軟件仍然在繪製它的東西,但direct3d只是呈現它的頂部,所以你只能看到d3d輸出。

+0

不,一個單獨的。另外,我沒有做任何渲染。我所稱的是「Direct3DCreate9」和「CreateDevice」,就是這樣。 – 2011-02-14 11:52:15

+0

你如何創建設備?你可以發佈參數嗎?你有調試嗎?也許有什麼在日誌中,表明創建設備上的問題 – cppanda 2011-02-14 12:39:52