首先,一般情況...通過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;
}
}
}
不,一個單獨的。另外,我沒有做任何渲染。我所稱的是「Direct3DCreate9」和「CreateDevice」,就是這樣。 – 2011-02-14 11:52:15
你如何創建設備?你可以發佈參數嗎?你有調試嗎?也許有什麼在日誌中,表明創建設備上的問題 – cppanda 2011-02-14 12:39:52