C++ 错误C2664:无法将“IDWriteFactory2**”转换为“IUnknown**”

C++ 错误C2664:无法将“IDWriteFactory2**”转换为“IUnknown**”,c++,directx-11,C++,Directx 11,以下mwe基本上是从中提取的。完整的示例编译并运行良好,但是我的mwe没有使用Visual Studio 2013进行编译,我不明白为什么不能 #include <dwrite_2.h> #include <atlbase.h> using namespace std; void main() { IDWriteFactory2* m_spdwriteFactory; DWriteCreateFactory( DWRITE_FACTORY_

以下mwe基本上是从中提取的。完整的示例编译并运行良好,但是我的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> Source.cpp

1> Source.cpp16:错误C2664:“HRESULT DWriteCreateFactoryDWRITE\u FACTORY\u TYPE,const IID&,IUnknown**”:无法将参数3从“IDWriteFactory2**”转换为“IUnknown**”

1> 指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换

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


您需要将MspdWriteFactory强制转换为IUnknown**以修复编译错误。请参见此处的示例:

示例代码使用WRL::ComPtr智能指针模板类。当您编写这样的代码时,强烈建议您这样做,它会处理很多当您直接使用接口指针时必须编写的枯燥且容易出错的管道代码。包括必须使用的void**cast,以使编译器相信您知道自己在做什么。以及您忘记调用Release而在代码片段中造成的内存泄漏。如果您将注释表述为一个答案,我会接受它,因为它说明了问题和解决方案。Hans Passant在注释中的回答也很有帮助,因为他指出了我的提取与链接示例的不同之处。