c++ - 如何修复从 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。如果您查看上面的代码,这是预期的,它不会检查是否surface
为surface->backend
NULL。
我的应用程序代码如下所示 -
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);
}
此更改会解决我的问题吗?任何形式的帮助都将受到高度赞赏。谢谢。
解决方案
推荐阅读
- python - 在构建 NodeDef 时,输入“ref”传递了 int32 预期的 ref 类型
- java - 如何使用 fcm 通知修复 sender_id_mismatch
- python - 消息:错误:轮询更改失败:通过 Selenium 和 FirefoxProfile 下载文件时尝试获取资源时出现 NetworkError
- python - 避免过度拟合使用 keras 的序列问题
- python - 如何导入在一个模块中创建的数据框以在新模块中处理相同的数据?
- html - 将 DIV 包装在锚标记中时,布局会混乱吗?
- docker - 如何选择性地启动 docker-compose 依赖容器?
- regex - 正则表达式帮助!需要将字符串剥离为仅数字
- ios - IOS 推送通知未分组 - apn
- sniffing - 如何使用 sip 软件拨打电话