UWP アプリケーションの画像プリミティブ描画用の C++ ランタイム ライブラリを作成するために、 Microsoft のDirectX と XAML の相互運用に関する公式チュートリアルに従おうとしています。ただし、コードにはバグやタイプミスがたくさんあります。一部を適応させることができましたが、実行時エラーが発生しています。
私は次のようにコードを適応させました。
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);
d2d1
コードのデバッグ中に、ハンドルが を返していることがわかりますE_INVALIDARG
。NULL
マルチスレッド アクセスを無効にする代わりにデバイス プロパティを渡そうとしましたが、エラーは解決しません。この行より前のオブジェクトは正しく初期化されているようです。
この動作の原因は何ですか?
編集
VTT のコメントはデバイスの構築に役立ちましたが、デバイスが適切ではないようです。私の適応コードは次のとおりです。
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
ます。デバイスの構造が間違っているためだと思います。