【问题标题】:error C2664: cannot convert 'IDWriteFactory2 **' to 'IUnknown **'错误 C2664:无法将“IDWriteFactory2 **”转换为“IUnknown **”
【发布时间】:2014-09-25 01:12:01
【问题描述】:

以下mwe基本是从this example中提取的。完整的示例可以编译并且运行良好,但是我的 mwe 无法使用 Visual Studio 2013 进行编译,我不明白为什么不这样做。

#include <dwrite_2.h>
#include <atlbase.h>

using namespace std;


void main()
{
    IDWriteFactory2* m_spdwriteFactory;

    DWriteCreateFactory(
    DWRITE_FACTORY_TYPE_SHARED,
    __uuidof( IDWriteFactory2 ),
    &( m_spdwriteFactory )
    );
}

错误信息如下:

----- 构建开始:项目:测试,配置:调试 x64 ------

1> 来源.cpp

1>Source.cpp(16):错误 C2664:“HRESULT DWriteCreateFactory(DWRITE_FACTORY_TYPE,const IID &,IUnknown **)”:无法将参数 3 从“IDWriteFactory2 **”转换为“IUnknown **”

1> 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

【问题讨论】:

  • 示例代码使用 WRL::ComPtr 智能指针模板类。当您编写这样的代码时,强烈推荐使用它,它可以处理您在直接使用接口指针时必须编写的许多无聊且容易出错的管道代码。包括你必须使用的 (void**) 强制转换来让编译器相信你知道你在做什么。还有你忘记调用 Release() 在你的 sn-p 中创建的内存泄漏。
  • 如果您将您的评论表述为一个答案,我会接受它,因为它说明了问题和解决方案。

标签: c++ directx-11


【解决方案1】:

您需要将 m_spdwriteFactory 强制转换为 IUnknown** 以修复编译错误。请参阅此处的示例:http://msdn.microsoft.com/en-us/library/windows/desktop/dd368040(v=vs.85).aspx

【讨论】:

  • Hans Passant 的回答(仅在 cmets 中)也很有帮助,因为他指出了我的“提取”与链接示例的不同之处。
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-03-01
相关资源
最近更新 更多