Direct2d CreateBitmapfromWICBitmap在ATL中给出断言错误

时间:2012-12-20 19:13:04

标签: c++ visual-studio-2010 com atl direct2d

我有一个简单的函数,它加载一个Png文件并将其作为ID2D1Bitmap返回。但是当它尝试调用CreateBitmapfromWicBitmap函数时,它会产生调试断言错误。有趣的是,我首先在一个单独的项目中创建了一个imageload函数,它在那里工作得很好。这两个函数都有相同的代码,而第二个函数则给出错误。

这是错误代码:

ID2D1Bitmap* Wnd::LoadPng(LPCWSTR Path) {
    CComPtr<IWICBitmapDecoder> pDecoder;
    CComPtr<IWICBitmapFrameDecode> pFrame;
    CComPtr<ID2D1Bitmap> pBit;
    CComPtr<IWICFormatConverter> pConv;
    HRESULT Hr;

    Hr = m_pWICFactory->CreateDecoderFromFilename(Path,NULL,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&pDecoder);

    if (SUCCEEDED(Hr)) {
        Hr = m_pWICFactory->CreateFormatConverter(&pConv);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pDecoder->GetFrame(0,&pFrame);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pConv->Initialize(pFrame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
    }

    if (SUCCEEDED(Hr)) {
        Hr = m_pRT->CreateBitmapFromWicBitmap(pConv,0,&pBit);
    }
    return pBit;
}

错误发生在函数_NoAddRefReleaseOnCComPtr第182行的atlcomcli.h中。

我仔细检查了所有标题和库,它们在两个项目中都是相同的(在第二个项目中有一些额外的标题)。

以下是WORKS的代码:

        CComPtr<IWICFormatConverter> Conv;
        m_pWICFactory->CreateFormatConverter(&Conv);
        CComPtr<IWICBitmapFrameDecode> Frame;
        m_pDecoder->GetFrame(0,&Frame);
        Frame->GetSize(&W,&H);
        Conv->Initialize(Frame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
        CComPtr<ID2D1Bitmap> Bit;
        Hr = m_pRT->CreateBitmapFromWicBitmap(Conv,0,&Bit);
        m_pBitmap.push_back(Bit);

此处预定义了BitmapDecoder,但它与第一​​个代码段完全相同。

------------------------------- FIXED --------------- -------------

我第三次忘记为我的rendertarget调用init函数。

1 个答案:

答案 0 :(得分:0)

断言失败警告您,您正试图&#34;使用&#34;通过NULL模板的CComPtr接口指针。您应该查看调用堆栈,其中包含您所在代码的确切行,以及哪个变量包含您希望为非NULL的NULL指针。或者只是使用调试器逐步执行代码。