Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误

Posted

技术标签:

【中文标题】Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误【英文标题】:Direct2d CreateBitmapfromWICBitmap giving assert error within ATL 【发布时间】:2012-12-08 08:53:54 【问题描述】:

我有一个简单的函数,它加载一个 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;

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

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

这是有效的代码:

        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,但是和第一个sn-p中的完全一样。

------------------- 已修复 --------------- -------------

我第三次忘记为我的渲染目标调用 init 函数。

【问题讨论】:

【参考方案1】:

断言失败警告您正在尝试通过CComPtr 模板“使用”NULL 接口指针。您应该在调用堆栈上查找您所在的代码的确切行,以及哪个变量包含您希望为非 NULL 的 NULL 指针。或者,只需使用调试器单步执行您的代码。

【讨论】:

哇...我第三次忘记为我的渲染目标调用 init 函数了。

以上是关于Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误的主要内容,如果未能解决你的问题,请参考以下文章

Direct2D坐标错误

Direct2D 第6篇 绘制多种风格的线条

Direct2D教程Direct2D已经来了,谁是GDI的终结者?

在 WinForm 中使用 Direct2D

Direct2D 中的 GDI Pen 等效项

Direct2D教程渲染位图