Будет ли изменен пиксель CImage, если он попытается загрузить другое изображение, и метод загрузки завершится с ошибкой?Что произойдет, если CImage :: Load не работает?
ответ
Исключительные гарантии не документированы, поэтому вы ничего не можете принять.
Глядя на исходном коде для 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;
}
Спасибо, это именно то, что мне нужно. – iouvxz
Кроме того, вы можете использовать 'CImage :: IsNull()' для проверки успешности загрузки в другой точке кода. –
- 1. Что произойдет, если статический класс Load failed
- 2. Что произойдет, если action = ""?
- 3. Что произойдет, если файлы AIDL не совпадут?
- 4. Что произойдет, если я не вызову session_start()?
- 5. Что произойдет, если php.ini отсутствует?
- 6. Что произойдет, если отключить таймер?
- 7. Что произойдет, если NSURLCache заполнен?
- 8. Что произойдет, если UITableViewCell не будет выпущен?
- 9. Что произойдет, если я не очищу строку?
- 10. Что произойдет, если переменная не получит значение?
- 11. Что произойдет, если Кодовые контракты не установлены?
- 12. Если не очищена переменная ThreadLocal, что произойдет?
- 13. Что произойдет, если я не удалю?
- 14. Что произойдет, если open не удастся?
- 15. Что произойдет, если execlp не включит NULL?
- 16. Что произойдет, если SD-карта не установлена?
- 17. Что произойдет, если дешифратор не будет запущен
- 18. C#: что произойдет, если исключение не обнаружено
- 19. Что произойдет, если файл не существует
- 20. Что произойдет, если я не вызываю dispose()?
- 21. Что произойдет, если ViewState Disabled
- 22. Что произойдет, если * .exe.config удален?
- 23. Что произойдет, если stdin заполняется?
- 24. Что произойдет, если клиент отключится?
- 25. Что произойдет, если sem_init() вызывается дважды?
- 26. Что произойдет, если программа драйвера сработает?
- 27. Что произойдет, если вы прервите нажатие Git?
- 28. Что произойдет, если указатель исчерпывает сферу
- 29. состояние «если» не работает с .load()
- 30. Что произойдет, если память стека будет заполнена
Пробовали ли вы его уже? –
@ πάνταῥεῖ: Тестирование сбоя не так просто, как вы заставляете его звучать. Загрузка может завершиться неудачей по ряду причин: файл изображения может отсутствовать, файл может быть недоступен для текущего пользователя, у файла изображения может быть неподдерживаемый или недопустимый формат файла, у приложения заканчивается память и т. Д. Некоторые из этих условий ошибки не будут уничтожать ранее загруженное изображение, в то время как другие будут. – IInspectable
@ πάντα ῥεῖ Я пробовал, он провалился, и пиксели остались неизменными. – iouvxz