¿Cómo guardar un ID2D1Bitmap en un archivo usando WIC?

Tengo un problema con guardar un mapa de bits en un archivo. Estoy usandoCómo guardar ID2D1Bitmap en un archivo PNG como referencia, pero tengo un error diferente al publicado en eso.

Recibo el error 0x88990015 HRESULT, que significa: el recurso utilizado fue creado por un objetivo de representación en un dominio de recursos diferente.

Aquí está mi código:

void Wnd::SavePng(LPCWSTR Path,ID2D1Bitmap* pBit) {
    CComPtr<ID2D1RenderTarget> pRT;
    CComPtr<IWICBitmap> pB;
    CComPtr<IWICBitmapEncoder> pEncoder;
    CComPtr<IWICBitmapFrameEncode> pFrame;
    CComPtr<IWICStream> pStream;

    WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA;
    HRESULT Hr = m_pWICFactory->CreateBitmap(pBit->GetSize().width,pBit->GetSize().height,format,WICBitmapCacheOnLoad,&pB); 

    if (SUCCEEDED(Hr)) {
        D2D1_RENDER_TARGET_PROPERTIES RTProps = RenderTargetProperties();
        RTProps.pixelFormat = PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED);
        Hr = m_pDirect2dFactory->CreateWicBitmapRenderTarget(pB,&RTProps,&pRT);
    }

    if (SUCCEEDED(Hr)) {
        pRT->BeginDraw();
        pRT->Clear();
        pRT->DrawBitmap(pBit);
        Hr = pRT->EndDraw();
    }

    if (SUCCEEDED(Hr)) {
        Hr = m_pWICFactory->CreateStream(&pStream);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pStream->InitializeFromFilename(Path,GENERIC_WRITE);
    }

    if (SUCCEEDED(Hr)) {
        Hr = m_pWICFactory->CreateEncoder(GUID_ContainerFormatPng,NULL,&pEncoder);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pEncoder->Initialize(pStream,WICBitmapEncoderNoCache);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pEncoder->CreateNewFrame(&pFrame,NULL);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pFrame->Initialize(NULL);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pFrame->SetSize(pBit->GetSize().width,pBit->GetSize().height);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pFrame->SetPixelFormat(&format);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pFrame->WriteSource(pB,NULL);
    }

    if (SUCCEEDED(Hr)) {
        Hr = pFrame->Commit();
    }

    if (SUCCEEDED(Hr)) {
        Hr = pEncoder->Commit();
    }
}

Entiendo que no puede usar los recursos creados por otra fábrica con otra, pero tiene que haber una manera de hacer que esto funcione.

Respuestas a la pregunta(1)

Su respuesta a la pregunta