Зачем мне здесь эти фигурные скобки?Кто-нибудь может объяснить мне, почему это происходит? - PullRequest
1 голос
/ 04 июля 2019

Я делаю код, чтобы сделать скриншот и сохранить его в виде файла 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.

1 Ответ

5 голосов
/ 04 июля 2019

У вас есть переменная Gdiplus::Bitmap bitmap, объявленная в фигурных скобках.Он будет уничтожен при закрытии }.Без фигурных скобок он не будет уничтожен, пока после вызова GdiplusShutdown.

...