2011-02-14 37 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