У меня есть устаревшее приложение, которое использует библиотеку Cairo для рисования изображений и текстов. Иногда это приложение вылетает. Я не знаю пути воспроизведения, довольно редко и случайным образом. Я создал дампы cra sh и обнаружил, что каждый раз, когда я получаю нарушение прав доступа от 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;
}
Эта функция возвращает HD C, связанный с этой поверхностью, или NULL, если нет. Он также возвращает NULL, если поверхность не является поверхностью win32.
Судя по дампу cra sh, который я обнаружил, surface->backend
было NULL, когда произошла эта sh ошибка. Что ожидается, если вы посмотрите на код выше, он не проверяет, является ли 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
Также обратите внимание, что этот блок не всегда трескается sh, поэтому я не могу понять, что здесь происходит не так.
После поиска в Google немного, я обнаружил, что некоторые люди проверяют наличие каких-либо предыдущих ошибок вроде этой:
if (cairo_surface_status(mySurface) == 0) {
hDC = cairo_win32_surface_get_dc(mySurface);
}
Исправит ли это изменение мою проблему? Любая помощь приветствуется. Спасибо.