c++ - CreateHwndRenderTarget引发异常:读取访问冲突。 **这**是nullptr

标签 c++ windows winapi direct2d

我最近一直在使用this教程学习Win32 API。我一直在尝试创建一个基于Direct2D的显示圆形的窗口。但是,程序不断抛出异常:

Exception thrown: read access violation.
**this** was nullptr.
VS 2019然后在此部分打开d2d1.h:
CreateHwndRenderTarget(
        CONST D2D1_RENDER_TARGET_PROPERTIES &renderTargetProperties,
        CONST D2D1_HWND_RENDER_TARGET_PROPERTIES &hwndRenderTargetProperties,
        _COM_Outptr_ ID2D1HwndRenderTarget **hwndRenderTarget 
        )  
    {
        return CreateHwndRenderTarget(&renderTargetProperties, &hwndRenderTargetProperties, hwndRenderTarget);
    }
这是我的代码中导致此问题的部分:
HRESULT CreateGraphicsResources(HWND hWnd) {
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL) {
        RECT rc;
        GetClientRect(hWnd, &rc);

        D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(hWnd, size),
            &pRenderTarget);
        
        if (SUCCEEDED(hr)) {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}
这是我调用该函数的地方:
case WM_PAINT:
        {
            HRESULT hr = CreateGraphicsResources(hWnd);
            if (SUCCEEDED(hr))
            {
                PAINTSTRUCT ps;
                BeginPaint(hWnd, &ps);

                pRenderTarget->BeginDraw();

                pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue));
                pRenderTarget->FillEllipse(ellipse, pBrush);

                hr = pRenderTarget->EndDraw();
                if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
                {
                    DiscardGraphicsResources();
                }
                EndPaint(hWnd, &ps);
            }
}
那么,该异常是什么意思,又是什么引发异常呢?
另外,我该如何解决?
谢谢您的帮助。
完整文件可用here

最佳答案

您的pFactory引用为null。但是您要初始化它,为什么它为null?由于您的代码已损坏,因此会执行以下操作:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    ... some code
    case WM_SIZE:
        {
           ... some code
        }
        
    // there is no break here!
    // first call to WM_SIZE falls down to WM_DESTROY which destroys your pFactory...
    
    case WM_DESTROY:
        DiscardGraphicsResources();
        SafeRelease(&pFactory);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
只需在break之前添加WM_DESTROY即可。

关于c++ - CreateHwndRenderTarget引发异常:读取访问冲突。 **这**是nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63634525/

相关文章:

c++ - Cassandra 中协调器节点和 C++ 驱动程序的联系点之间的区别?

c++ - visual studio 2015 中的安全功能

winapi - bcc32 - 没有控制台子系统,也没有 Windows 子系统

c++ - 在以 Windows 为目标的 Delphi 应用程序中是否对对象引用计数?如果是,它的目的是什么?

c++ - 在 Windows 上从文件末尾添加/删除字节

winapi - GetDoubleClickTime 意外返回 0

sql-server-2005 - 部署 SQL Server : installing a second instance?

c++ - 代码在 Sun Studio 上编译但在 gcc 上出错

c++ - 这个 "new"语法是什么意思?

windows - 使用 NAudio 获取输入设备支持的格式