Идентификация дискеты

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Идентификация дискеты

Сообщение Densil » 31.03.2006 (Пт) 10:57

Доброе время суток всем.
Подскажите, если кто знает, каким образом можно узнать идентификационный номер дискеты с помощью программного кода VB?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2006 (Пт) 11:35

Берем WMI:



Код: Выделить всё
strComputer = "."
Set objWMIService = GetObject( _
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
    "Select * from Win32_Logicaldisk")
For Each objItem in colItems
  If (objItem.DriveType=2) And ((objItem.FileSystem="FAT12") Or (objItem.FileSystem="FAT16")) Then WScript.Echo "Diskette Serial Number is " & objItem.VolumeSerialNumber
Next




О как.

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 31.03.2006 (Пт) 12:02

Так... Пробую хоть что-то понять. Я ведь новичок :) и сходу в этом коде не разберусь. Может какие коменты добавите?

Что такое: "Берём WMI" ?

Значит strComputer, objWMIService, colItems, objItem - это переменные.

Что такое WScript.Echo?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2006 (Пт) 12:32

Это Windows Management Instrumentation.

Подробнее можно прочесть в MSDN.



Да, это переменные. strComputer - это имя компьютера. . означает, тот комп на котором запущена программа.

WScript.Echo это просто вывод на экран.



Для проверки того как это работает, вставь дискету в дисковод, потом скопируй этот код в файл, скажем, c:\123.vbs и запусти его.

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 31.03.2006 (Пт) 13:02

Ну что-то определённо происходит. Происходит обращение к дискетке, после чего предъявляется пустая форма. Может сделать вывод результата на label?

Можно так написать? :

... Then Label1.Caption = objItem.VolumeSerialNumber
Next

Хм-м. Нельзя. Сразу ошибка возникает. Как тогда?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2006 (Пт) 13:55

Я бы попробовал тогда, CStr(objItem.VolumeSerialNumber)

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 01.04.2006 (Сб) 10:01

Что-то не получается. В общем мне нужно чтобы при запуске программы происходила проверка того - моя дискета стоит в дисководе, или нет. Т.е. простейшая защита от копирования. Нужно чтобы идентификационный номер дискеты передавался в переменную, или в caption элемента, неважно, главное чтобы программа его распознала и я его тоже смог бы увидеть. Вот.

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 01.04.2006 (Сб) 17:25

Ну хто-нибудь подскажите плиз.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 01.04.2006 (Сб) 20:57

Densil
Код: Выделить всё

Private Sub Form_Load()
Dim objWMIService As Object, strComputer As String
strComputer = "."
Set objWMIService = GetObject( _
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
    "Select * from Win32_Logicaldisk")
For Each objItem In colItems

  If (objItem.DriveType = 2) And ((objItem.FileSystem = "FAT12") Or (objItem.FileSystem = "FAT16")) Then
WScript.Echo "Diskette Serial Number is " & objItem.VolumeSerialNumber
  If Not IsNull(objItem.VolumeSerialNumber) Then Debug.Print CStr(objItem.VolumeSerialNumber)
end if
Next

End Sub

Правда если честно, он у меня не достает сериал дискетки :? (обращение к дисководу не происходит просто)хотя сериалы винчестера и дисковдов достал на ура =)
Ну а так код как раз тот что нужен =)
Если всё делать своими ручками, они скоро отвалятся !

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.04.2006 (Вс) 9:29

Дело в том, что я однажды что-то делал с дискетой - то ли форматировал, то ли на вирусы проверял, то ли ещё что (ну не помню хучь убей), и в конце этой операции появился ряд характеристик диска "А", в том числе и какой-то номер, по моему идентификационный или как он там называля. Но сейчас я не могу этого добиться и всё тут :(
Вот я и подумал, что это как-то несложно реализовать через VB. Но что-то не выходит каменный цветок :D
Кстати, Kovu, твой код тоже не помог, или я что не так сделал. Если этот код использовать как есть, то опять происходит обращение к дискете, после чего появляется пустая форма. Что за напасть :(

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 02.04.2006 (Вс) 10:41

а почему не воспользоваться GetVolumeInformation:
Код: Выделить всё
Private Declare Function GetVolumeInformation Lib "Kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
Private Sub Form_Load()
    Dim Serial As Long
    GetVolumeInformation "a:\", "", 255, Serial, 0, 0, "", 255
    MsgBox Serial
End Sub


Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.04.2006 (Вс) 11:21

Спасибо за совет. Вроде бы теперь высвечивается номер в диалоговом окне. Но мне нужно, чтобы происходила проверка:
если номер совпал - программа запускается, если не совпал - не запускается.
Например, при загрузке фомы передать номер в переменную Serial,
дальше проверка:
если Serial = 12345 то закончить проверку,
если нет - выгрузить форму программы.

Так можно, или только через MsgBox?

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 02.04.2006 (Вс) 11:25

ухты... через Msgbox ты только выводишь инфу.

зы. твою защиту можно обойти...даже очень просто. проверяй SN через таймер, хотя юзеру не понрявится тормоза с опросом флопа

зы. это не заводской номер дискеты, он "даётся" при форматировании диска

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.04.2006 (Вс) 11:34

Sirik писал(а):зы. это не заводской номер дискеты, он "даётся" при форматировании диска

...и за полминуты легко меняется на любой другой.
Изображение

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.04.2006 (Вс) 11:54

Это я в курсе, что этот номер даётся при форматировании. И то, что эту защиту легко обойти меня не волнует совершенно. Эту программу будут юзать люди о-очень далёкие от программирования и от хака :wink: Рабочие железной дороги. Но тупо скопировать прогу для друзей конечно смогут. И поэтому нужно какую-то препону поставить. Проще всего, ИМХО, то, что я описал выше. Всё же есть какая-нибудь встроенная функция VB для определения таких номеров? То что написал Sirik работает - номер вытаскивает, но я не понял этот код и не знаю как его переделать для моих целей. :cry:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.04.2006 (Вс) 12:08

Вместо MsgBox напиши If Serial <> 12345 Then End.
Lasciate ogni speranza, voi ch'entrate.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.04.2006 (Вс) 12:08

Densil
То что передается первым параметором мсгбоксу(Serial) ставишь в условную конструкцию и будет тебе щастье :)
Если всё делать своими ручками, они скоро отвалятся !

Densil
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 02.03.2006 (Чт) 16:27

Сообщение Densil » 02.04.2006 (Вс) 13:29

Большое спасибо всем, кажись заработало! :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

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

    TopList