【问题标题】:GDI+ initialization crashes the app, why?GDI+ 初始化使应用程序崩溃,为什么?
【发布时间】:2012-10-20 13:23:03
【问题描述】:

我有以下 C++ 行,它从 GDI 的设备上下文中获取 GDI+ 句柄:

//HDC hDC = device context from GDI
if(hDC)
{
    //Obtain graphics handle for GDI++
    Graphics* pgrpx = new Graphics(hDC);    //I get invalid memory exception here

    //Code continues
    //...

    //Free object
    delete pgrpx;
    pgrpx = NULL;
}

它在我的测试中运行良好。

但最近我收到了应用程序的崩溃转储,在我在上面的代码中指出的行中出现“线程引用的内存位置,它无法访问”异常——就在应该初始化 Graphics 对象的位置.

这可能是什么问题?以及如何解决?

【问题讨论】:

  • 你调用GDI+提供的初始化函数了吗?
  • 是的。忘了提那个。是 Gdiplus::GdiplusStartup 吗?
  • 类似的东西,但我也在考虑另一个(或者可能只是您需要创建的对象)。我没有经常使用 GDI+,部分原因是试图记住(如何)初始化它的额外麻烦。
  • @NathanMoinvaziri:hDC 来自 CreateCompatibleDC,我检查它是否为 NULL。但即使不是,那个 Graphics 构造函数能抛出异常吗?
  • 可能这个错误是因为在另一个线程上创建了hDC。

标签: c++ windows winapi gdi+ gdi


【解决方案1】:

您是否检查了 GDI+ 的初始化?我不确定问题是否出在此处,但您可以尝试一下。

Gdiplus::GdiplusStartupInput    gdiplusStartupInput;
ULONG_PTR                       gdiplusToken;
if(GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Gdiplus::Ok)
{
    MessageBox(NULL, TEXT("GDI+ failed to start up!"),
        TEXT("Error!"), MB_ICONERROR);
    return -1;
}

【讨论】:

  • 是的,当然。这是事后搞砸的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2018-12-30
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多