【问题标题】:What am I doing wrong? Program crashes. [GDI+, WINAPI, C++]我究竟做错了什么?程序崩溃。 [GDI+、WINAPI、C++]
【发布时间】:2016-12-01 18:23:56
【问题描述】:

我用 C++ 编写了一个程序,它必须在屏幕上打印图像并在 2 秒后退出。一切正常,直到程序必须退出。程序运行时返回 0;指令,它崩溃了。我认为这是因为错误的解除分配,但代码似乎是正确的。


#include <iostream>
#include <windows.h>
#include <gdiplus.h>

using namespace std;
using namespace Gdiplus;

HDC hdc = GetDC(NULL);

int main() {
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    Graphics graphics(hdc);
    Rect dst(500, 500, 17, 17);
    Image* image = Image::FromFile(L"image.png", false);
    cout<<"Image size: "<<image->GetWidth()<<", "<<image->GetHeight()<<endl;
    graphics.DrawImage(image, dst);
    delete image;

    GdiplusShutdown(gdiplusToken);
    Sleep(2000);
    return 0;
}


我有最新的编译器,我通过以下方式编译:

g++ -c main.cpp -std=g++11

g++ -o main main.o -lgdiplus

【问题讨论】:

    标签: c++ winapi crash gdi+


    【解决方案1】:

    图形析构函数在 GdiplusShutdown 之后执行。你需要用

    包围块
    Graphics graphics(hoc);
    

    在{}中

    【讨论】:

    • @IgorSantarek - 当然你不会检查 GdiplusStartup 和 main - Image::FromFile - 所以你需要在这里最小 2 if () {} ,但是直接错误是由析构函数在退出时执行的本地块,在当前版本中,这是在 GdiplusShutdown 之后
    猜你喜欢
    • 2023-01-19
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2019-12-23
    • 2014-06-15
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多