2015-10-24 4 views
4

Будет ли изменен пиксель CImage, если он попытается загрузить другое изображение, и метод загрузки завершится с ошибкой?Что произойдет, если CImage :: Load не работает?

+1

Пробовали ли вы его уже? –

+1

@ πάνταῥεῖ: Тестирование сбоя не так просто, как вы заставляете его звучать. Загрузка может завершиться неудачей по ряду причин: файл изображения может отсутствовать, файл может быть недоступен для текущего пользователя, у файла изображения может быть неподдерживаемый или недопустимый формат файла, у приложения заканчивается память и т. Д. Некоторые из этих условий ошибки не будут уничтожать ранее загруженное изображение, в то время как другие будут. – IInspectable

+0

@ πάντα ῥεῖ Я пробовал, он провалился, и пиксели остались неизменными. – iouvxz

ответ

4

Исключительные гарантии не документированы, поэтому вы ничего не можете принять.

Глядя на исходном коде для CImage::Load (atlimage.h) показывает, что неспособность загрузить изображение может уничтожить ранее сохраненное изображение. Обе пересылки Load в конечном итоге вызываются в CImage::CreateFromGdiplusBitmap. Этот член класса выполняет две операции: 1.) Он вызывает Create, чтобы создать новое хранилище для изображения. Эта операция разрушительна. 2.) Он копирует исходные данные изображения в пункт назначения. Эта операция может завершиться неудачей.

Поскольку у вас есть операция, которая может выйти из строя после операции, которая уничтожает любые предыдущие данные, вы не можете предположить, что отказ при загрузке изображения сохранит предыдущие данные изображения.

Следующий код реализует неразрушающий загрузку изображений, при первой загрузке изображения на временный, и назначение его назначения на успех только:

HRESULT NonDestructiveLoad(CImage& img, const CString& fileName) { 
    CImage tempImage; 
    HRESULT hr = tempImage.Load(fileName); 
    if (SUCCEEDED(hr)) { 
     // The following operations cannot fail 
     img.Destroy(); 
     img.Attach(tempImage.Detach()); 
    } 
    return hr; 
} 
+0

Спасибо, это именно то, что мне нужно. – iouvxz

+0

Кроме того, вы можете использовать 'CImage :: IsNull()' для проверки успешности загрузки в другой точке кода. –

Смежные вопросы