purebasic.info

PureBasic forum
Текущее время: Пн окт 15, 2018 12:05 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: Ср май 09, 2018 7:46 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 201
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Есть пример на AutoIt3, хотелось бы его аналог на PureBasic
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
; http://www.autoitscript.com/forum/topic/91598-get-disk-number-from-drive-letter/?p=659721
; Описание ........: Возвращает номер диска и номер раздела в формате n:n (<номер диска>:<номер раздела>)
; Параметры:
;               $sDriveLetter - Буква диска с двоеточием, например C:
;                                       Неудачно , возвращает -1, @error:
;                  |1 - Ошибка CreateFile, ваша система очень старая
;                  |2 - Диск не существует
;                  |3 - Неудачный вызов DeviceIoControl
;                  |4 - Не раздела диска
Func _GetDiskNimberForDrive($sDriveLetter) ; Буква диска
 
        Local $aDrive[2] = ['?', '?']
 
        Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                        "str", "\\.\" & $sDriveLetter, _; Буква диска
                        "dword", 0, _
                        "dword", 0, _
                        "ptr", 0, _
                        "dword", 3, _; OPEN_EXISTING
                        "dword", 128, _; FILE_ATTRIBUTE_NORMAL
                        "ptr", 0)
 
        If @error Then
                Return SetError(1, 0, $aDrive); Ваша система очень старая. Сделайте что-нибудь.
        EndIf
 
        If $a_hCall[0] = -1 Then
                Return SetError(2, 0, $aDrive) ; Диск не существует
        EndIf
 
        Local $hDevice = $a_hCall[0]
 
        Local $tIOCTL_STORAGE_GET_DEVICE_NUMBER = DllStructCreate("dword DeviceType;" & _
                        "dword DeviceNumber;" & _
                        "int PartitionNumber")
 
        Local $a_iCall = DllCall("kernel32.dll", "int", "DeviceIoControl", _
                        "hwnd", $hDevice, _
                        "dword", 0x2D1080, _; IOCTL_STORAGE_GET_DEVICE_NUMBER
                        "ptr", 0, _
                        "dword", 0, _
                        "ptr", DllStructGetPtr($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
                        "dword", DllStructGetSize($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
                        "dword*", 0, _
                        "ptr", 0)
 
        If @error Or Not $a_hCall[0] Then
                DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
                Return SetError(3, 0, $aDrive); неудачный вызов DeviceIoControl
        EndIf
 
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
 
        If DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceType") = 7 Then; FILE_DEVICE_DISK
                $aDrive[0] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceNumber")
                $aDrive[1] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "PartitionNumber")
                Return SetError(0, 0, $aDrive)
        EndIf
 
        Return SetError(4, 0, $aDrive); Не раздела диска
 
EndFunc   ;==>_GetDiskNimberForDrive



на выходе должно получится
0:1 Допустим диск С
0:2 Допустим диск D
1:1 Допустим флешка


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 09, 2018 12:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11292
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Structure IOCTL_STORAGE_GET_DEVICE_NUMBER
  DeviceType.l
  DeviceNumber.l
  PartitionNumber.i
EndStructure
 
Procedure GetDiskNimberForDrive(sDriveLetter.s, *Info.IOCTL_STORAGE_GET_DEVICE_NUMBER) ; Буква диска
  Res = 0
 
  hDevice = CreateFile_("\\.\" + sDriveLetter, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
  If hDevice <> #INVALID_HANDLE_VALUE
    Res = DeviceIoControl_(hDevice, $2D1080, 0, 0, *Info, SizeOf(IOCTL_STORAGE_GET_DEVICE_NUMBER), @x,  0)
    CloseHandle_(hDevice)
  EndIf
 
  ProcedureReturn Res
EndProcedure
 
x.IOCTL_STORAGE_GET_DEVICE_NUMBER
 
Debug GetDiskNimberForDrive("C:", @x)
Debug x\DeviceType
Debug x\DeviceNumber
Debug x\PartitionNumber


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 09, 2018 2:58 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 19, 2018 8:40 am
Сообщений: 17
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Смущает только: hDevice = CreateFile_("\\.\" + sDriveLetter, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
Или ничего в данном случае не создаётся?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 09, 2018 3:29 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11292
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
https://msdn.microsoft.com/en-us/librar ... p/aa363858
http://vsokovikov.narod.ru/New_MSDN_API ... tefile.htm

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 09, 2018 4:39 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 19, 2018 8:40 am
Сообщений: 17
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
OPEN_EXISTING Открывает файл. Функция завершается ошибкой, если файл не существует.
Ясно... :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 10, 2018 9:14 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 201
Благодарил (а): 20 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Вот ещё дали, единственно я Ret$="?:?" заполнил ?:?, чтобы в случае ошибки строка была нужного формата.
Код:
1
2
3
4
5
6
7
8
9
10
Procedure.s DriveGetNumber(DriveLetter$)
  Protected DriveInfo.STORAGE_DEVICE_NUMBER, Ret$="?:?",  hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL)
  If hDevice
    If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), #NUL,  #NUL)
      Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber)
    EndIf
    CloseHandle_(hDevice)
  EndIf
  ProcedureReturn Ret$
EndProcedure



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB