【问题标题】:Direct3D11 - Access violation executing location xxx on CreateSwapChainForCoreWindowDirect3D11 - 在 CreateSwapChainForCoreWindow 上执行位置 xxx 的访问冲突
【发布时间】:2021-02-05 21:01:24
【问题描述】:

我正在学习 C++ 和 Direct3D11/Direct2D(在 UWP 之上),但我正在努力让我的小测试程序运行。当我调用 CreateSwapChainForCoreWindow 时,它会引发访问冲突(具体异常请参见下文)。

我将 D3D 设备用于其他呼叫,并且它们正常工作,所以我认为这不是问题。交换链描述相对简单,交换链本身将在调用中设置。所以,我假设异常是因为我向窗口传递了一个不正确的指针,但我无法解决它。

例外:

在 UWP D2D 示例 v3.exe 中的 0x00007FF8FE44F4E0 (Windows.UI.dll) 处引发异常:0xC0000005:访问冲突执行位置 0x00007FF8FE44F4E0。

代码 sn-p (https://github.com/cwebb95/Direct2D_cppwinrt):

        ComPtr<IDXGISwapChain1> swapChain = nullptr;
        DX::ThrowIfFailed(dxgiFactory->CreateSwapChainForCoreWindow(m_d3dDevice.Get(),
                                        reinterpret_cast<IUnknown*>(&CoreWindow::GetForCurrentThread()),
                                        &swapChainDescription,
                                        NULL,    
                                        &swapChain));

【问题讨论】:

  • 您能告诉我您正在使用的项目类型吗?能否请您提供使用 Onedrive 或 GitHub 的示例代码?
  • 感谢您的建议。我添加了代码的 GitHub 存储库。此外,它是一个 C++ winrt 项目。

标签: c++ uwp direct2d direct3d11


【解决方案1】:

我能够通过将第二个参数更改为:

static_cast<::IUnknown*>(winrt::get_abi(CoreWindow::GetForCurrentThread()))

来自:

reinterpret_cast<IUnknown*>(&CoreWindow::GetForCurrentThread())

我还没有足够的知识知道为什么会解决这个问题,但我会研究并希望找出答案(非常感谢任何关于该问题的线索)。

【讨论】:

  • DXGI 需要到您的核心窗口对象的IUnknown* 接口,而不是 C++/WinRT 投影反对或 C++/CX 指针。这就是为什么您必须将其显式转换为“ABI”,这是一个您可以转换为IUnknown* 的 COM 指针。有关 Win32 和 UWP 的不同设备和交换链设置的一系列示例,请参阅 directx-vs-templates
  • 我刚刚调试到足以确定是转换为 ABI 而不是导致问题的 reinterpret_cast。感谢您解释为什么会这样。很有帮助!
  • 这也可能有点令人困惑,因为如果您使用从 WinRT^ 到 IUnknown* 的 reinterpret_cast,C++/CX (/ZW) 会自动执行“ABI 转换”技巧。对于 C++/WinRT,您必须明确使用 get_abi
猜你喜欢
  • 1970-01-01
  • 2013-10-11
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2023-03-23
  • 2017-08-30
  • 2022-01-21
相关资源
最近更新 更多