Имя пользователя:
Пароль:
 

Показать сообщение отдельно
MKN MKN вне форума

Ветеран


Сообщения: 2398
Благодарности: 574

Профиль | Отправить PM | Цитировать


Определяем букву CD/DVD привода и есть ли в нём диск.

Букву дисков можно конечно определить с помощью штатной команды GetDrives, но и этот код может пригодиться :
Код: Выделить весь код
OutFile "GetCDVolume.exe"

Section
Push $0
Push $1
Push $2
Push $3
; Выделяем блок памяти для определения максимальной  длины строковой переменной
System::Alloc ${NSIS_MAX_STRLEN}
Pop $3

; GetLogicalDriveStringsA - Определяет все диски ( заполняет буфер строками, которые определяют действительные устройства в системе )
System::Call 'kernel32::GetLogicalDriveStringsA(i, i) i(${NSIS_MAX_STRLEN}, r3)'
Loop:
; Функция lstrlenA возвращает длину строки в символах по указателю. 
; Именно lstrlenA используется для строк в формате ANSI. Используем эту функцию для получения длины строки.
System::Call 'kernel32::lstrlenA(t) i(i r3) .r2'
IntCmp $2 0 End

/*GetDriveTypeA - получение информации о типе диска
DRIVE_UNKNOWN - 0    Тип устройства не может быть определен.
DRIVE_NO_ROOT_DIR - 1   Корневой путь недопустим; например нет никаких томов, смонтированных по указанному пути.
DRIVE_REMOVABLE - 2    Удаляемые медиаустройства, например, флоппи-диск или съёмный жесткий диск.
DRIVE_FIXED - 3   Устройства , которые не могут быть удалены, например, фиксированный жесткий диск.
DRIVE_REMOTE - 4  удаленное (сетевое) устройство
DRIVE_CDROM - 5  устройство CD/DVD - ROM
DRIVE_RAMDISK - 6  RAM диск*/

System::Call 'kernel32::GetDriveTypeA(t) i(i r3) .r1'
StrCmp $1 5 0 Next ; проверка наличия диска

; получаем информацию о доступном месте на диске
System::Call 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i(i r3, 0, .r1, 0)'
StrCmp $1 0 +3
StrCpy $1 "Диск в приводе"
Goto +2
StrCpy $1 "В приводе НЕТ диска"
System::Call '*$3(&t${NSIS_MAX_STRLEN} .r0)' ; буква(путь) диска

MessageBox MB_OK|MB_TOPMOST "Буква диска : $0    Состояние привода : $1 "
Next:
IntOp $3 $3 + $2
IntOp $3 $3 + 1
Goto Loop
End: 
System::Free $3
Pop $3
Pop $2
Pop $1
Pop $0
SectionEnd

Отправлено: 17:23, 31-10-2013 | #686