Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法创建D2D1设备 我试图遵循微软的官方教程,以便为UWP应用程序制作一个用于图像原始绘制的C++运行库。然而,代码中充满了bug和打字错误。我已经设法调整了它的一些部分,但是我遇到了运行时错误_C++_Uwp_Directx_Direct2d_Wrl - Fatal编程技术网

无法创建D2D1设备 我试图遵循微软的官方教程,以便为UWP应用程序制作一个用于图像原始绘制的C++运行库。然而,代码中充满了bug和打字错误。我已经设法调整了它的一些部分,但是我遇到了运行时错误

无法创建D2D1设备 我试图遵循微软的官方教程,以便为UWP应用程序制作一个用于图像原始绘制的C++运行库。然而,代码中充满了bug和打字错误。我已经设法调整了它的一些部分,但是我遇到了运行时错误,c++,uwp,directx,direct2d,wrl,C++,Uwp,Directx,Direct2d,Wrl,我对代码进行了如下修改 Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisNativeWithD2D; IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource); sisInspectable->QueryInterface(__uuidof(ISurf

我对代码进行了如下修改

Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisNativeWithD2D;

IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource);
sisInspectable->QueryInterface(__uuidof(ISurfaceImageSourceNativeWithD2D), (void **)&m_sisNativeWithD2D);

Microsoft::WRL::ComPtr<ID3D11Device> m_d3dDevice;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_d3dContext;
Microsoft::WRL::ComPtr<ID2D1Device> m_d2dDevice;

// Create the DXGI device
D3D11CreateDevice(
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    0,
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &m_d3dDevice,
    NULL,
    &m_d3dContext);

Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
m_d3dDevice.As(&dxgiDevice);

// To enable multi-threaded access (optional)
Microsoft::WRL::ComPtr<ID3D10Multithread> d3dMultiThread;

m_d3dDevice->QueryInterface(__uuidof(ID3D10Multithread), (void **)&d3dMultiThread);

d3dMultiThread->SetMultithreadProtected(TRUE);

// Create the D2D device
HRESULT d2d1 = D2D1CreateDevice(dxgiDevice.Get(), NULL, &m_d2dDevice);
Microsoft::WRL::ComPtr<ISurfaceImageSourceNativeWithD2D> m_sisNativeWithD2D;

IInspectable* sisInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(surfaceImageSource);
sisInspectable->QueryInterface(__uuidof(ISurfaceImageSourceNativeWithD2D), (void **)&m_sisNativeWithD2D);

Microsoft::WRL::ComPtr<ID3D11Device> m_d3dDevice;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> m_d3dContext;
Microsoft::WRL::ComPtr<ID2D1Device> m_d2dDevice;

D3D_FEATURE_LEVEL array[] = {
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1,
};

D3D_FEATURE_LEVEL selectedFeatureLevel;

// Create the DXGI device
D3D11CreateDevice(
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    D3D11_CREATE_DEVICE_BGRA_SUPPORT,
    array,
    sizeof(array)/sizeof(D3D_FEATURE_LEVEL),
    D3D11_SDK_VERSION,
    &m_d3dDevice,
    &selectedFeatureLevel,
    &m_d3dContext);

//Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
//m_d3dDevice.As(&dxgiDevice);

Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
auto hr = m_d3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&dxgiDevice);

// To enable multi-threaded access (optional)
Microsoft::WRL::ComPtr<ID3D10Multithread> d3dMultiThread;
m_d3dDevice->QueryInterface(__uuidof(ID3D10Multithread), (void **)&d3dMultiThread);
d3dMultiThread->SetMultithreadProtected(TRUE);

// Create the D2D device
HRESULT d2d1 = D2D1CreateDevice(dxgiDevice.Get(), NULL, &m_d2dDevice);

// Set the D2D device
m_sisNativeWithD2D->SetDevice(m_d2dDevice.Get());

Microsoft::WRL::ComPtr<ID2D1DeviceContext> drawingContext;

RECT rect;
rect.top = 0;
rect.left = 0;
rect.right = 50;
rect.bottom = 50;

POINT offset;

HRESULT beginDrawHR = m_sisNativeWithD2D->BeginDraw(rect, __uuidof(ID2D1DeviceContext), &drawingContext, &offset);

但是,这里的
BeginDraw()
方法会因
E_INVALIDARG
而失败。我假设这是因为不正确的设备构造。

看起来您正在避免将合理的值传递到
D3D11CreateDevice
构造函数中。对于d2d兼容性,您需要至少通过
D3D11\u创建\u设备\u BGRA\u支持
标志和适当的功能级别阵列。另外,让它自动选择适配器通常不是一个好主意,通常您希望使用目标输出所属的适配器。@VTT我通过传递标志和功能级别数组创建了对象。这个问题似乎已经解决了,但我想将适配器传递给构造函数。您将如何着手构建合适的一个?我尝试使用
IDXGIFactory
并枚举适配器,但是
m_d3dDevice.As(&dxgiDevice)每次都失败。
m_sisNativeWithD2D->SetDevice
调用成功吗?调用此代码时是否已显示surfaceImageSource?
SetDevice()
返回
S\u OK
。调用方代码位于C#中,
SurfaceImageSource
被指定为窗口中可见的图像组件的源。看起来您在避免将合理的值传递给
D3D11CreateDevice
构造函数。对于d2d兼容性,您需要至少通过
D3D11\u创建\u设备\u BGRA\u支持
标志和适当的功能级别阵列。另外,让它自动选择适配器通常不是一个好主意,通常您希望使用目标输出所属的适配器。@VTT我通过传递标志和功能级别数组创建了对象。这个问题似乎已经解决了,但我想将适配器传递给构造函数。您将如何着手构建合适的一个?我尝试使用
IDXGIFactory
并枚举适配器,但是
m_d3dDevice.As(&dxgiDevice)每次都失败。
m_sisNativeWithD2D->SetDevice
调用成功吗?调用此代码时是否已显示surfaceImageSource?
SetDevice()
返回
S\u OK
。调用者代码是C#,而
SurfaceImageSource
被指定为窗口中可见的图像组件的源。