Проверить готовность диска без появления окна ошибки Windows
Игра "О счастливчик"
Игрок - Прошу убрать два неверных варианта.
Ведущий - Итак, дорогой компютер, уберите пожалуста два неверных варианта.
Надпись на мониторах - "Программа выполнила недопустимую ошибку и будет закрыта"
Ведущий - Что-ж по просьбе компании Microsoft - реклама....
Вы можете использовать функцию Windows API SetErrorMode() для отключения диалога Window's critical Error.
Сначала определяем нужную функцию:
function IsDriveReady(DriveLetter: char): bool;
var
OldErrorMode: Word;
OldDirectory: string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
GetDir(0, OldDirectory);
{$I-}
ChDir(DriveLetter + ':\');
{$I+}if IoResult <> 0 then
Result := False
else
Result := True;
ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;
затем используем её:
ifnot IsDriveReady('A') then
ShowMessage('Drive Not Ready')
else
ShowMessage('Drive is Ready');
Перевод контента на русский язык:
Задача заключается в создании функции, которая проверяет готовность дискового устройства без отображения диалогового окна критических ошибок Windows. Код использует функцию Windows API SetErrorMode() для достижения этого.
Рассмотрим код:
Функция IsDriveReady принимает букву диска в качестве входного параметра и возвращает булевое значение, указывающее готовность или не готовность диска.
Внутри функции устанавливается режим ошибок с помощью SetErrorMode() с флагом SEM_NOOPENFILEERRORBOX (0x00002000), который отключает отображение диалоговых окон критических ошибок.
Затем код получает текущий каталог с помощью GetDir() и хранит его в OldDirectory.
Код изменяет текущий каталог на указанную букву диска с помощью ChDir(). Это вызовет исключение, если диск не готов.
Если результат I/O-операции (IoResult) не равен 0, это означает, что возникла ошибка, и функция возвращает False. В противном случае она возвращает True.
Наконец, код восстанавливает режим ошибок с помощью SetErrorMode() с оригинальным значением, хранящимся в OldErrorMode.
Для использования этой функции можно вызвать ее с буквой диска в качестве входного параметра, например:
ifnotIsDriveReady('A')thenShowMessage('Диск не готов')elseShowMessage('Диск готов');
Это проверит готовность диска 'A' и отобразит сообщение соответственно. Если диск не готов, то не будет отображаться диалоговое окно критических ошибок.
В ответ на ваш запрос о удалении двух неправильных вариантов, я предполагаю, что вы имели в виду два неправильных реализации этой функции. Поскольку мы используем правильную реализацию, предоставленную в коде, нет необходимости удалять ничего.
Однако, если вы имеете в виду альтернативные решения, есть несколько вариантов:
Вместо использования SetErrorMode() можно использовать блок try-except для ловли и обработки исключений, вызванных операцией изменения каталога.
Вы можете также использовать функцию Windows API GetDriveType() для проверки типа диска (например, CD, сеть и т.д.) перед попыткой доступа к нему.
Обратите внимание, что эти альтернативы могут не быть точными эквивалентами оригинальной реализации, но они могут предложить альтернативные подходы для достижения вашей цели.
В статье описывается способ проверки готовности диска в Windows без вывода ошибочного диалога, используя функцию SetErrorMode() и написанный на языке Pascal код для отключения ошибок и проверки доступности дискеты.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS