Каким образом можно проверить доступность диска, т.е. вставлен диск (флеш карта) или нет.
Если проверять такими средствами как Dir$, FindFirstFile, IsFolder и т.п., то при отсутствии диска генерируется исключение.
#COMPILE EXE
#DIM ALL
DECLARE FUNCTION GetLogicalDriveStrings LIB "kernel32" ALIAS _
"GetLogicalDriveStringsA" (BYVAL nBufferLength AS LONG, _
BYVAL lpBuffer AS ASCIIZ PTR) AS LONG
FUNCTION IsDriveExists(BYVAL sDrive AS STRING) AS BYTE
IF LEN(sDrive) = 0 THEN EXIT FUNCTION
DIM DrvList(1024) AS BYTE
LOCAL DrvPtr AS ASCIIZ PTR
LOCAL Drv AS STRING
DrvPtr = VARPTR(DrvList(0))
GetLogicalDriveStrings(1024, BYVAL DrvPtr)
DO
Drv = @DrvPtr
IF INSTR(1, Drv, LEFT$(sDrive, 1)) > 0 THEN
FUNCTION = 1 : EXIT FUNCTION
END IF
DrvPtr = DrvPtr + LEN(Drv) + 1
LOOP UNTIL LEN(Drv) = 0
FUNCTION = 0
END FUNCTION
FUNCTION PBMAIN () AS LONG
?STR$(IsDriveExists("C"))
?STR$(IsDriveExists("D:\..."))
END FUNCTION
On Error Resume Next
' Обращаемся к устройству
' Если ЕСТЬ ошибка, то изучаем / обрабатываем ее [ номер, описание ... ] и получаем ответ.
ger_kar писал(а):Каким образом можно проверить доступность диска, т.е. вставлен диск (флеш карта) или нет.
Если проверять такими средствами как Dir$, FindFirstFile, IsFolder и т.п., то при отсутствии диска генерируется исключение.
У меня если смотреть в консоли управления дисками хорошо видно, что диск отсутствует, значит система об этом каким-то образом узнает. Не посредством же обработки исключений. Наверное есть что-то поприличнее, вот только что?jangle писал(а):У меня на картридере такая ошибка если даже из проводника обратится к диску в который не вставлена флеш-карта
Ну тогда если через обработку ошибок делать, то надо On Error Goto Err_Handler. А с On Error Resume Next Ничего не поймается .Sam777e писал(а):В VB просто написал бы ... On Error Resume Next
Этот код опрашивает доступные устройства, в число которых попадают и устройства с отсутсвующими носителями. Таким образом приведенный пример делает совершенно не то что надо. Код по ссылке тоже не совсем то. Хотя из него я узнал про режимы и функцию SetErrorMode, про которые раньше ничего не ведал. Таким образом окно как подавить я теперь знаю, но все равно хочется чего нибудь по изящней .Kroos писал(а):GetLogicalDriveStringsНапример:
ger_kar писал(а): Sam777e писал(а):В VB просто написал бы ... On Error Resume Next
Ну тогда если через обработку ошибок делать, то надо On Error Goto Err_Handler. А с On Error Resume Next Ничего не поймается .
Sam777e писал(а):
- Код: Выделить всё
' Если ЕСТЬ ошибка, то изучаем / обрабатываем ее [ номер, описание ... ] и получаем ответ.
If Err then
' А вот тут надо пораскинуть умом и ОБРАБОТАТЬ "ошибку"
' а, если сказать точнее, информацию любезно предоставленную тебе системой
End If
Public Sub TryDrive(S As String)
Dim V As Variant
On Error Resume Next
V = Dir(S)
' Err.Clear ' <==
If Err Then
MsgBox Err.Description, , Err.Number
End If
Err.Clear
On Error GoTo 0
End Sub
Public Sub Test()
TryDrive "E:\"
End Sub
Дык матчасть в этом направлении изучена вдоль и поперек, в т.ч. и на уровне машинных кодов Про способ, который описан далее я в принципе теоретически знаю. Теоретически, потому, что на практике, именно в таком виде я его никогда такой способ не использовал. Еще с до VB' шных времен привык к On Error Goto, поэтому если надо обработать ошибку, а не просто ее пропустить всегда делал это в отдельном обработчике, ссылка на метку которого указывалась в On Error Goto. И привык настолько что делается это машинально. Поэтому когда прочитал On Error Resume Next, то это у меня никак не за ассоциировалось с обработкой ошибки , скорее наоборот.Sam777e писал(а):Читать надо несколько внимательнее /* а также учить матчасть */, так как я уже писал
MSDN писал(а):SEM_FAILCRITICALERRORS
0x0001
Система не отображает критической ошибки обработчика окна сообщения. Вместо этого, система посылает ошибки вызывающему процессу.
Лучшая практика такова, что все приложения вызывают для всего процесса SetErrorMode функцию с параметром SEM_FAILCRITICALERRORS при запуске. Это сделано для предотвращения диалогов ошибки и режима зависания приложения
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16