c++ - 为什么我在这里需要这个花括号?谁能解释我为什么会这样?

标签 c++ visual-studio gdi+

我正在编写代码来制作屏幕截图并将其保存为 JPEG 文件类型。我找到了这段代码,但我不明白为什么当我在之后删除花括号时它会给我一个错误 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);.

完整代码:

void gdiscreen()
{
    using namespace Gdiplus;
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    {
        HDC scrdc, memdc;
        HBITMAP membit;
        scrdc = ::GetDC(0);
        int Height = GetSystemMetrics(SM_CYSCREEN);
        int Width = GetSystemMetrics(SM_CXSCREEN);
        memdc = CreateCompatibleDC(scrdc);
        membit = CreateCompatibleBitmap(scrdc, Width, Height);
        HBITMAP hOldBitmap = (HBITMAP)SelectObject(memdc, membit);
        BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
        Gdiplus::Bitmap bitmap(membit, NULL);
        CLSID clsid;
        GetEncoderClsid(L"image/jpeg", &clsid);
        bitmap.Save(L"screen.jpeg", &clsid);
        SelectObject(memdc, hOldBitmap);
        DeleteObject(memdc);
        DeleteObject(membit);
        ::ReleaseDC(0, scrdc);
    }
    GdiplusShutdown(gdiplusToken);
}

有人可以向我解释为什么我需要花括号吗?

当我删除花括号时,出现以下错误:

Exception produced in 0x661AF6B8 (GdiPlus.dll) in DebugScreenShotModule.exe: 0xC0000005: Access violation when reading location 0x029E12AC.

最佳答案

您有一个变量 Gdiplus::Bitmap bitmap 在大括号内声明。它将在结束 } 时销毁。如果没有花括号,它不会被销毁,直到 GdiplusShutdown 被调用。

关于c++ - 为什么我在这里需要这个花括号?谁能解释我为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878784/

相关文章:

.net - Visual Studio Shell - 创建自定义 IDE

visual-studio - Elastic beanstalk 不显示 Web 应用程序

c++ - 默认参数值中的 static_cast

C++ - 如何获取正在运行的进程的 .exe 路径作为 std::string?

c++ - Netbeans 8.1(用于 C/C++)找不到我的编译器(gcc-6.0.0 开发版)

c++ - 写在透明窗口上的文本周围透明颜色键的彩色边框

分层窗口上的 C++ GDI+ 绘图图像不起作用

c++ - 将 std::map 与 std::thread 一起使用的意外行为

node.js - 如何从 Visual Studio 调试 C++ Electron 插件

c# - 无法将图像渲染到 HttpContext.Response.OutputStream