在远程桌面中创建DirectX设备失败

时间:2011-11-14 12:03:10

标签: c++ winapi directx rdp

我有一个使用DirectX捕获屏幕的应用程序。该应用程序在本地工作正常,但是当我通过远程桌面会话运行时,IDirect3D9 :: CreateDevice函数失败:

    d3dpp.Windowed=WINDOW_MODE;
    d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.BackBufferFormat=ddm.Format;
    d3dpp.BackBufferHeight=nDisplayHeight=gScreenRect.bottom =ddm.Height;
    d3dpp.BackBufferWidth=nDisplayWidth=gScreenRect.right =ddm.Width;
    d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=hWnd;
    d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&g_pd3dDevice)))
    {
        ErrorMessage("Unable to Create Device");
        return E_FAIL;
    }

我使用Windows 7通过RDP访问Windows Server 2008 R2。

这到底出了什么问题?我读到可以通过RDP使用Direct3D。

2 个答案:

答案 0 :(得分:5)

我不知道失败的确切原因,但我可以给你指路。 当您通过RDP连接时,Windows根本不会加载您的本机视频驱动程序,并且显示器上实际上没有显示任何内容。相反,系统加载RDPDD虚拟视频驱动程序,该驱动程序将系统内存中的所有内容绘制出来,并通过网络将其发送到RDP客户端。这就是远程桌面的工作原理。

因此您的原生视频卡/驱动程序根本不参与。 RDPDD是一个非常简约的“帧缓冲”驱动程序,它根本不支持Direct3D / DirectDraw。

OTOH您使用CreateDevice参数调用D3DDEVTYPE_REF,即使您没有兼容D3D的视频卡也应该有效,D3D应该在软件中模拟。因此 - 我不知道为什么会这样。我猜测问题可能在D3DPRESENT_PARAMETERS参数范围内。也许其中一些可能无法模仿。

尝试检查错误代码,使用D3DPRESENT_PARAMETERS

答案 1 :(得分:-3)

哈哈,问题是我没有安装DirectX驱动程序。它运作后!