Войти

Показать полную графическую версию : [решено] Ошибка защиты от записи


sLiDeR-X
13-03-2015, 13:25
Программа работает с картами памяти и USB флешками. Нередко бывает, что у SD-карты переключатель сдвинут в положение "LOCK", и карта не работает на запись. Перед считыванием данных я сделал проверку на запись: кладу файл на карту. Если успешно удаляю и делаю отметку, что запись возможна, если же нет, то делаю отметку что невозможна. Но каждый раз появляется надоедливое окно. Как его убрать?

http://i67.fastpic.ru/thumb/2015/0306/00/8064940649eb4ced2c2a381ae6135c00.jpeg (http://fastpic.ru/view/67/2015/0306/8064940649eb4ced2c2a381ae6135c00.png.html)

Creat0R
13-03-2015, 17:35
каждый раз появляется надоедливое окно. Как его убрать? »
Нужно предотвратить его появление.
Для этого нужно увидеть код программы, или её часть, но в рабочем состояний (та часть которая обращается к флешке).

Mike909
13-03-2015, 17:53
$sDrive = "H:\"
$sTmpFileName = $sDrive & "test.tmp"
ConsoleWrite($sDrive & " " & DriveStatus($sDrive) & ' ' & DriveGetType($sDrive) & @LF)
$hFile = FileOpen ( $sTmpFileName ,1 )
If $hFile==-1 Then
ConsoleWrite("Error open file in write mode." & @LF)
Else
ConsoleWrite("Ok." & @LF)
FileClose ($hFile)
FileDelete ($sTmpFileName)
EndIf

Creat0R
13-03-2015, 18:46
#include <WinAPIFiles.au3>

;...

$hFile = -1

If _WinAPI_IsWritableEx($sDrive) Then
$hFile = FileOpen($sTmpFileName, 1)
EndIf

;...

Func _WinAPI_IsWritableEx($sDrive)
Local $hFile = _WinAPI_CreateFileEx('\\.\' & $sDrive, $OPEN_EXISTING, 0, $FILE_SHARE_READWRITE)
If @error Then Return SetError(@error + 20, @extended, False)

Local $aRet = DllCall('kernel32.dll', 'bool', 'DeviceIoControl', 'handle', $hFile, 'dword', 0x00070024, 'ptr', 0, 'dword', 0, _
'ptr', 0, 'dword', 0, 'dword*', 0, 'ptr', 0)
Local Const $ERROR_WRITE_PROTECT = 19 ; The media is write protected.
If __CheckErrorCloseHandle($aRet, $hFile, 1) <> 10 And @extended = $ERROR_WRITE_PROTECT Then Return SetError(@error, @extended, False)

Return $aRet[0]
EndFunc

sLiDeR-X
13-03-2015, 22:09
Mike909, это ничем не отличается от того, как сделано у меня. Окно появляется!

Creat0R, спасибо! Функция _WinAPI_IsWritableEx($sDrive) работает.




© OSzone.net 2001-2012