首页 > 解决方案 > 如何修复从 Cairo 库调用的崩溃问题?

问题描述

我有一个遗留应用程序,它使用 Cairo 库来绘制图像和文本。有时此应用程序会崩溃。我不知道繁殖路径,它非常罕见且随机。我创建了故障转储,发现每次我从cairo_win32_surface_get_dc function获得访问冲突。

这是开罗的源代码 -

HDC  cairo_win32_surface_get_dc (cairo_surface_t *surface)
{
    if (surface->backend->type == CAIRO_SURFACE_TYPE_WIN32)
    return to_win32_surface(surface)->dc;

    if (_cairo_surface_is_paginated (surface)) {
    cairo_surface_t *target = _cairo_paginated_surface_get_target (surface);
    if (target->backend->type == CAIRO_SURFACE_TYPE_WIN32_PRINTING)
        return to_win32_surface(target)->dc;
    }

    return NULL;
}

此函数返回与此表面关联的 HDC,如果没有则返回 NULL。如果表面不是 win32 表面,它也返回 NULL。

从我发现的崩溃转储中,surface->backend发生此崩溃时为 NULL。如果您查看上面的代码,这是预期的,它不会检查是否surfacesurface->backendNULL。

我的应用程序代码如下所示 -

if( mySurface ) {
    hDC = cairo_win32_surface_get_dc(mySurface);
}

我的想法是在调用之前添加一个额外的检查是否mySurface->backend为 NULL,cairo_win32_surface_get_dc但是mySurface->backend从这里无法访问。给我以下错误 -

Error           C2027   use of undefined type '_cairo_surface'
Error (active)  E0393   pointer to incomplete class type is not allowed 

另请注意,此块并不总是崩溃,所以我无法弄清楚这里出了什么问题。

谷歌搜索了一下后,我发现有些人正在检查以前的任何错误,比如这样-

if (cairo_surface_status(mySurface) == 0) {
    hDC = cairo_win32_surface_get_dc(mySurface);
}

此更改会解决我的问题吗?任何形式的帮助都将受到高度赞赏。谢谢。

标签: c++crashcairo

解决方案


推荐阅读