C++ CreateWictTextureFromFile返回E_NOINTERFACE

C++ CreateWictTextureFromFile返回E_NOINTERFACE,c++,com,direct3d,hresult,wic,C++,Com,Direct3d,Hresult,Wic,我想创建一个纹理加载器。 但是,当我创建以下行时: HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0); 它返回E_NOINTERFACE。 我要加载的文件确实存在,并且成功创建了ID3D11Device和ID3D11DeviceContext 这是我的班级宣言: using std::wstring; using Microso

我想创建一个纹理加载器。 但是,当我创建以下行时:

HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
它返回
E_NOINTERFACE
。 我要加载的文件确实存在,并且成功创建了
ID3D11Device
ID3D11DeviceContext

这是我的班级宣言:

    using std::wstring;
    using Microsoft::WRL::ComPtr;
    using DirectX::CreateWICTextureFromFile;
    class Texture2DHandle {
    private:
        ComPtr<ID3D11Texture2D> texture;
        ComPtr<ID3D11ShaderResourceView> shaderResourceView;
    public:
        Texture2DHandle() = default;
        Texture2DHandle(void* data, int w, int h, DXGI_FORMAT format, ID3D11Device* device);
        Texture2DHandle(wstring file, ID3D11Device* device, ID3D11DeviceContext* context);

        ID3D11Texture2D* tex() const;
        ID3D11ShaderResourceView* srv() const;
    };
使用std::wstring;
使用Microsoft::WRL::ComPtr;
使用DirectX::CreateWictTextureFromFile;
类Texture2DHandle{
私人:
ComPtr结构;
ComPtr shaderResourceView;
公众:
Texture2DHandle()=默认值;
Texture2DHandle(void*数据、int w、int h、DXGI_格式、ID3D11Device*设备);
Texture2DHandle(wstring文件,ID3D11Device*设备,ID3D11DeviceContext*上下文);
ID3D11Texture2D*tex()常量;
ID3D11ShaderResourceView*srv()常量;
};
以下是构造函数的定义:

Texture2DHandle::Texture2DHandle(wstring file, ID3D11Device* device,ID3D11DeviceContext* context)
{
    ComPtr<ID3D11Resource> resource;
    HRESULT res = CreateWICTextureFromFile(device, file.c_str(),&resource,&shaderResourceView,0);
    if (FAILED(res))
        throw std::exception("Could not load texture from file!");
    res = resource.As<ID3D11Texture2D>(&texture);
    if (FAILED(res))
        throw std::exception("Could not load texture from file!");
}
Texture2DHandle::Texture2DHandle(wstring文件,ID3D11Device*设备,ID3D11DeviceContext*上下文)
{
ComPtr资源;
HRESULT res=CreateWictTextureFromFile(设备,文件.c_str(),&resource,&shaderResourceView,0);
如果(失败(res))
抛出std::异常(“无法从文件加载纹理!”);
res=资源。As(&纹理);
如果(失败(res))
抛出std::异常(“无法从文件加载纹理!”);
}

我不知道E_NOINTERFACE是什么意思,因为设备和设备上下文都存在

请确保您已初始化COM,因为这是最可能的问题

#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
    Microsoft::WRL::Wrappers::RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
        // error
#else
    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (FAILED(hr))
        // error
#endif

有关详细文档,请参阅。

确保已初始化COM,因为这是最可能出现的问题

#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/)
    Microsoft::WRL::Wrappers::RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
        // error
#else
    HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (FAILED(hr))
        // error
#endif

有关详细文档,请参阅。

CreateWICTextureFromFile是一种帮助程序,您可以从中获得我相信的源代码()尝试查看哪个部分准确返回该错误。CreateWICTextureFromFile是一种帮助程序,您可以从中获得我相信的源代码()尝试查看哪个部分准确返回该错误。在线程上调用CoInitialize有帮助!非常感谢你!它不应该是
COINIT\u多线程的
(如
coinitializex
的文档所述)吗?文档说要使用
COINIT\u多线程的
,所以我更新了它。标题定义了它:
COINIT\u multi-threaded=COINITBASE\u multi-threaded
,因此它们是同义词。在线程上调用CoInitialize会有所帮助!非常感谢你!它不应该是
COINIT\u多线程的
(如
coinitializex
的文档所述)吗?文档说要使用
COINIT\u多线程的
,所以我更新了它。标题定义它:
COINIT\u multi-threaded=COINITBASE\u multi-threaded
,因此它们是同义词。