【问题标题】:What is DX::ThrowIfFailed?什么是 DX::ThrowIfFailed?
【发布时间】:2012-11-15 13:08:28
【问题描述】:

我最近重新开始使用 C++。我已经离开使用 C# 的 C++/CLI 至少一年了,我有点生疏了。我正在查看适用于 Windows 8 的 Direct3D 应用程序的基本示例,但找不到任何解释

 DX::ThrowIfFailed

确实如此。从它的说法来看,如果 DirectX 中的某些东西失败了,它会执行一些东西,但从实现来看,它似乎被用于初始化东西,作为 Direct3D 演示的基础:

    Platform::String^ text = "Hello, DirectX!";

DX::ThrowIfFailed(
    m_dwriteFactory->CreateTextLayout(
        message->Data(),
        message->Length(),
        m_textFormat.Get(),
        700, // maxWidth.
        1000, // maxHeight.
        &m_textLayout
        )
    );

谁能给我解释一下这个功能是如何工作的。我看到它分散在示例中,但没有多少谷歌搜索可以减轻适当的文档。提前谢谢你!

【问题讨论】:

  • 这不是 C++/CLI。它是 C++/CX。非常相似的语法;非常不同的语义。

标签: c++ visual-c++ c++-cx


【解决方案1】:

此函数将失败的 HRESULT 转换为异常。它是这样定义的,在 DirectXHelper.h 中,它是 Direct3D 应用程序模板的一部分:

inline void ThrowIfFailed(HRESULT hr)
{
    if (FAILED(hr))
    {
        // Set a breakpoint on this line to catch Win32 API errors.
        throw Platform::Exception::CreateException(hr);
    }
}

如果您使用的是 Visual Studio,您可以右键单击代码中ThrowIfFailed 的任何实例,然后选择“转到定义”。这将打开包含定义的文件并导航到其位置。

有关此帮助程序的更多信息,请参阅GitHub

【讨论】:

  • 出于某种原因,我认为这是 Direct3D 的一部分。下次生病时,请确保在询问之前对所有内容进行定义。非常感谢!
  • 即使它是 Direct3D 的一部分,它也必须位于包含的头文件或引用的 Windows 元数据文件中;无论哪种情况,Go To Definition 都应该找到定义。
  • @JamesMcNellis 我知道这是一个有点旧的线程但是如果我没有DirectXHelper.h 怎么办? (Windows 8.1 64 位 MSVC 2013)
  • @Quest,windows SDK 示例有这个标头。你会在这里找到那些:link
  • DIrect3D Win32 Game template 中还有一个简单的内联实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多