![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
ДЫМ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Казалось бы, что может быть проще, но поди ж ты.
Проблема такова: я в цикле копирую файл через буфер, используя файловые потоки (при работе с Handle такая же история). Примерно так (в упрощенном варианте)
А потом вот что: 1) файл, который копируется (C:\Test.txt) весит 1 Mb, на дискете свободно от силы 50 Kb, эти 50 килобайт записываются и ВСЁ, никакого исключения не возникает, цикл завершается, хотя должно быть что-то вроде "На диске не хватает места"; 2) если в процессе копирования вынуть дискету (может и такое быть), то вообще начинается какая-то вакханалия - выскакикавает диалог с заголовком "Windows - Устройство не готово", жму <Отмена>, выскакивает точно такой же диалог, но с заголовком "Project1:Project1.exe - Устройство не готово", а затем уж и вовсе в трее сообщение "Ошибка отложенной записи ", но НИ ЛОКАЛЬНЫЙ НИ ГЛОБАЛЬНЫЙ обработчики в моем приложении не срабатывают. (При чем здесь "отложенная запись", её же надо отдельно организовывать через API). Почему в первом случае не возникает исключения? Как во втором случае обработать возникшие исключения непосредственно в приложении, хотя бы после системного обработчика, чтобы вообще понять - успешно прошло копирование или нет? (Кстати, система - WinXP) |
|||
|
||||
Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: нет Всего: 7 |
Вот так ошибка обрабатывается, если не хватает места при копировании например. А вот как обработать "изъятие дискеты" пока не додумался.... Будем искать.......
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
ДЫМ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Но как отключить системный обработчик?
|
|||
|
||||
Dimich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 25.8.2004 Где: Брянск Репутация: нет Всего: 7 |
Даже не знаю... не получается! Как то раньше не задумывался над этим, все время старался работать с файлами (когда это возможно) не через потоки, а по старинке через BlockRead/BlockWrite так такой бяки не возникает. Может это будет решением для твоей проблемы? Если у кого есть еще мысли, ответьте пожалуйста! Этот вопрос интерестен и мне...
--------------------
Не работает - исправь, работает - не трогай!!! |
|||
|
||||
Girder |
|
||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
![]() К примеру код, для копирования, устраняет почти все проблеммы:
Но лудше потоковое чтение-запись организовать на чистом API - тогда можно все не желательные окна подавить или же если возникла ошибка то, не уничтожать файловый поток - виновник. Удачи. Это сообщение отредактировал(а) Girder - 7.10.2004, 15:38 -------------------- Как слышим, так и пишим. Истина где-то там... |
||||
|
|||||
ДЫМ |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Функция SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX) никак не влияет на то, что появляется окно системного обработчика, если вынуть дискету во время копирования. Да и метод CopyFrom мне не подходит, очень надо через буфер
Глючная вещь - эти потоки
здесь надо бы добавить
Ну и шут с этими окошками, какой-никакой выход я нашел
Но все-таки можно ли не прибегая к API, подавить окошки системного обработчика? |
||||||
|
|||||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
а)все остальное оставь как есть; б)замени ErrOld:=SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX) на SetErrorMode(0) и удали SetErrorMode(ErrOld); Это сообщение отредактировал(а) Girder - 8.10.2004, 10:09 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
Переписал не много свой пример, не знаю у кого как, но у меня вообще не происходит вызова системного обработчика (но лудше конечно использовать API):
Удачи. Это сообщение отредактировал(а) Girder - 22.7.2005, 22:29 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |