purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 3:05 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: Чт апр 26, 2012 1:04 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1085
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Недавно возник вопрос как узнать какие диски и их тип подключены к компьютеру и вот собственно код:

Код:
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
For i=65 To 90
  Select GetDriveType_(Chr(i)+":")
     
    Case #DRIVE_REMOVABLE ; съемное устройство
      vname$=Space(100)
      GetVolumeInformation_(Chr(i)+":", @vname$,100,0,0,0,0,0)
      Debug "Съемный носитель - "+Chr(i)+" - "+vname$
     
    Case #DRIVE_CDROM ; сдром
      vname$=Space(100)
      GetVolumeInformation_(Chr(i)+":", @vname$,100,0,0,0,0,0)
      Debug "CD-Rom - "+Chr(i)+" - "+vname$
     
     Case #DRIVE_FIXED ; Жесткий диск
      vname$=Space(100)
      GetVolumeInformation_(Chr(i)+":", @vname$,100,0,0,0,0,0)
      Debug "Жеский диск - "+Chr(i)+" - "+vname$
     
     Case #DRIVE_REMOTE ; Стевой диск
      vname$=Space(100)
      GetVolumeInformation_(Chr(i)+":", @vname$,100,0,0,0,0,0)
      Debug "Сетевой диск - "+Chr(i)+" - "+vname$
     
     Case #DRIVE_RAMDISK ; в оперативной памяти
      vname$=Space(100)
      GetVolumeInformation_(Chr(i)+":", @vname$,100,0,0,0,0,0)
      Debug "Виртуальный диск - "+Chr(i)+" - "+vname$
     
  EndSelect
Next


_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт окт 27, 2017 2:08 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Всем, привет!
Озадачился следующим вопросом: как не только получить список всех подключенных сетевых дисков, но также получить информацию о состоянии каждого из них (как в консоли "net use"). Можно конечно выдернуть и из консоли, но интересует есть ли другой способ получения данной информации. Как я понял здесь поможет только "MPR.DLL" и вызов юникодной функции "WNetGetConnectionW". Примеров как подключить/отключить сетевой диск полно, а вот о получении статуса нашёл только один:
Код:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
;-{ NETWORK DRIVES
; PureBasic Forum: Rings, Hi-Toro, Fangbeast
; skywalk: cosmetic changes to include in FileLib = "FL_xxx"
; Tested on Windows XP Pro SP3.
Structure FL_DriveList ; Keep track of drive letters and net paths
  DriveLetter.s
  DrivePath.s
EndStructure
Global NewList FL_NetDrives.FL_DriveList()  ; Tracking list for the network drives on your system
 
Procedure FL_GetNetDrives()                         ;
  ; Find all network drives attached to the system and store them in a linked list
  Protected.i DriveCount, DriveType, LenUNCPath, ErrorNum, ExistsFlag
  Protected.s DriveLetter, UNCPath
  #dllMPR = 1                                                 ; Use a constant for the dll
  If OpenLibrary(#dllMPR, "MPR.DLL")                          ; Open the necessary windows dll
    For DriveCount = 4 To 26                                  ; Count through drives, exclude floppies
      DriveLetter = Chr(DriveCount + 64) + ":"                ; Get current drive letter
      DriveType = GetDriveType_(DriveLetter)                  ; What sort of drive are we looking for
      If DriveType = #DRIVE_REMOTE                            ; Did we find a remote drive?
        UNCPath = Space(128)                                  ; Allocate space for the path length
        LenUNCPath = 127                                      ; Allocate the length for this space
        UNCPath = Left(UNCPath, LenUNCPath)                   ; Get the current drive found
       
        ErrorNum = CallFunction(#dllMPR, "WNetGetConnectionW", @DriveLetter, @UNCPath, @LenUNCPath)
        ;ErrorNum = WNetGetConnection_()
        Debug ErrorNum
        If ErrorNum = #NO_ERROR                               ; We didn't get an error
 
         
          ForEach FL_NetDrives()                                 ; Iterate through our tracking list
            If FL_NetDrives()\DrivePath = UNCPath                ; If the drive already exists in the list
              ExistsFlag = 1                                  ; Set the flag on
            Else                                              ; Otherwise
              ExistsFlag = 0                                  ; Set the flag off
            EndIf                                             ; No more tests
          Next                                                ; Next drive in the tracking list
          If ExistsFlag = 0                                   ; If the flag was set off
            AddElement(FL_NetDrives())                           ; Add a blank element to the tracking list
            FL_NetDrives()\DriveLetter = DriveLetter             ; Add the found drive to it
            FL_NetDrives()\DrivePath   = UNCPath                 ; Add the found drive to it
          EndIf                                               ; No more tests
          ForEach FL_NetDrives()                                 ; Iterate through the tracking list
            ; Debug NetDrives()                               ; Show the found network drives or other things you need to do with them
          Next                                                ; Next drive in the list
 
        Else                                                  ; Otherwise, we have an error
          Select ErrorNum                                     ; Test the error number
            Case #ERROR_BAD_DEVICE         : UNCPath = "ERROR_BAD_DEVICE"
            Case #ERROR_NOT_CONNECTED      : UNCPath = "ERROR_NOT_CONNECTED"
            Case #ERROR_MORE_DATA          : UNCPath = "ERROR_MORE_DATA"
            Case #ERROR_CONNECTION_UNAVAIL : UNCPath = "ERROR_CONNECTION_UNAVAIL"
            Case #ERROR_NO_NETWORK         : UNCPath = "ERROR_NO_NETWORK"
            Case #ERROR_EXTENDED_ERROR     : UNCPath = "ERROR_EXTENDED_ERROR"
            Case #ERROR_NO_NET_OR_BAD_PATH : UNCPath = "ERROR_NO_NET_OR_BAD_PATH"
            Case #ERROR_INVALID_ADDRESS    : UNCPath = "ERROR_INVALID_ADDRESS"
            Default                        : UNCPath = "UNKNOWN ERROR " + Str(ErrorNum)
          EndSelect                                           ; No more tests to do
        EndIf                                                 ; No more conditional tests
       ; AllDrives.s = AllDrives + UNCPath + #CRLF$            ; Usually add up all the network drives found here
      EndIf                                                   ; No more conditional tests
    Next                                                      ; Look for the next possible drive letter
    ; If just reporting ALL the drives found, this is a good place to put it
    ; If Len(AllDrives)    
    ;   Debug AllDrives
    ; EndIf
    ; ------------------------------------------------------------------------------------------------  
  Else                                                        ; Otherwise, we cannot find the right dll for these functions
   MessageRequester("Error", "MPR.DLL not found", 0)          ; Give the user an error message
  EndIf                                                       ; No more tests
EndProcedure                                                  
 
                                               
;-}
FL_GetNetDrives()
ForEach FL_NetDrives()
  Debug FL_NetDrives()\DriveLetter + " -> " + FL_NetDrives()\DrivePath
Next


но и он похоже работает некорректно. Говорю про Debug ErrorNum. Подключал несколько сеевых дисков, затем один намеренно делал недоступным, значит по идее этот диск не должен был попасть в список, а он там есть. И возвращенные значения ErrorNum равны, что для доступного диска, что для отключенного.

Мне нужно получить статус всех сетевых дисков для дальнейшего действия над недоступными, а именно попытаться толкнуть их. В связи с чем задам здесь же и второй вопрос по консольной команде pushd, а именно:
Знает ли кто каким "пуриковским" кодом её можно заменить. Не нравится то, что она как бонус создаёт доп. сетевой диск. И каждый раз приходится вызывать popd.


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

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


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

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


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

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