Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: event cdrom Добавлено: 14.06.04 03:57  

Автор вопроса:  Chill | ICQ: 554200 
Как отследить событие вложения диска в cdrom?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 14.06.04 11:10
пример есть:
ftp://crts.ru/sne/2chill/

Ответить

Номер ответа: 2
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #2 Добавлено: 14.06.04 12:39
Не заходит на фтп, таймаут истек =(

Ответить

Номер ответа: 3
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #3
Добавлено: 14.06.04 13:27
значит на мыло...

Ответить

Номер ответа: 4
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #4
Добавлено: 17.06.04 09:36

лови....

'=================================================================================
'Для события появления и изятия диска в CD-ROM
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE = &H219
Public glngPrevWndProc As Long

Public Function MyWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_DEVICECHANGE Then
Select Case wParam
' Событие возникает при появлении нового диска в CD-ROM'е.
Case &H8000&
Call Form1.DeviceArrival
' Событие возникает при изъятии диска из CD-ROM'а
Case &H8004&
Call Form1.DeviceRemoveComplete
End Select
MyWindowProc = 0
Exit Function
End If
' остальные сообщения передаются для обработки стандартной процедуре окна
MyWindowProc = CallWindowProc(glngPrevWndProc, hwnd, Msg, wParam, lParam)
End Function

Ответить

Номер ответа: 5
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #5 Добавлено: 17.06.04 13:51
А без использования окна? Если у меня, например, окна нет...

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 17.06.04 16:56
Chill, создай его :))) См. пример WndReseiver в примерах на этом сайте...

Ответить

Номер ответа: 7
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #7 Добавлено: 17.06.04 17:03
А без окна никак не обойтись? НЕ хочу его создавать... у меня dll

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 22.06.04 01:06
Только совсем не обязательно это будет CD-ROM и совсем не обязательно именно тот, который тебе нужен. Так что проверять придется самому.

Ответить

Номер ответа: 9
Автор ответа:
 Pantalone



Вопросов: 32
Ответов: 104
 Профиль | | #9 Добавлено: 05.02.06 08:32
Прошу прощения за подъем старой ветки, хотел уточнить, почему не обязательно это будет CD-ROM?
Этот код может и на что-то другое сработать?

Ответить

Номер ответа: 10
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 05.02.06 16:18
Попросту этот код следует чуть доработать.

При сообщении в wParam будет передан параметр: DBT_DEVICEARRIVAL

А в lParam - указатель на структуру DEV_BROADCAST_HDR. Второй параметр которой dbch_devicetype указывает на тип стройства, его проверки-то в коде, что запостен был выше, и нет...

За более подробной информацией, см. MSDN

Ответить

Номер ответа: 11
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #11 Добавлено: 07.02.06 07:40
Должен помочь примерно такой код:
Есть проблема, не могу найти объявление константы IOCTL_DISK_CHECK_VERIFY (свистните, если кто найдет).
IOCTL_DISK_CHECK_VERIFY – проверка наличия носителя и его читаемости в устройстве со сменным носителем информации.

Option Explicit
    Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End Type
    Private Type OVERLAPPED
        ternal As Long
        ternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
    End Type
    Private Enum IDE_DRIVE_NUMBER
        PRIMARY_MASTER
        PRIMARY_SLAVE
        SECONDARY_MASTER
        SECONDARY_SLAVE
    End Enum
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long

Private Sub Command1_Click()
    Dim OL As OVERLAPPED
    Dim retVal As Long
    Dim lpcbBytesReturned As Long
    retVal = DeviceIoControl(hDrive(1), IOCTL_DISK_CHECK_VERIFY, ByVal 0, 0, ByVal 0, lpcbBytesReturned, ByVal 0)
    'или так - retVal = DeviceIoControl(hDrive(1), IOCTL_DISK_CHECK_VERIFY, ByVal 0, 0, ByVal 0, lpcbBytesReturned, OL)
    If retVal <> 0 Then
        MsgBox "CD - Drive is ready", vbInformation, "Ready"
    Else
        MsgBox "CD - Drive is not ready", vbInformation, "Not ready"
    End If
End Sub
Private Function hDrive(drvNum As IDE_DRIVE_NUMBER) As Long
   'параметр drvNum, найдешь перебором от 0 до 3 (0 скорее всего - нет)
   If IsWindowsNT Then
      hDrive = CreateFile("\\.\PhysicalDrive" & CStr(drvNum), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
   Else
      hDrive = CreateFile("\\.\SMARTVSD", 0, 0, ByVal 0&, CREATE_NEW, 0, 0)
   End If
End Function

Private Function IsWindowsNT() As Boolean
   Dim vInfo As OSVERSIONINFO
   vInfo.dwOSVersionInfoSize = Len(vInfo)
   If (GetVersionEx(vInfo)) = 0 Then Exit Function
   If vInfo.dwPlatformId = 2 Then IsWindowsNT = True
End Function

Ответить

Номер ответа: 12
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #12 Добавлено: 07.02.06 14:04
Вот, теперь работает

Option Explicit
   Private Const CREATE_NEW As Long = 1
   Private Const FILE_SHARE_READ As Long = &H1
   Private Const FILE_SHARE_WRITE As Long = &H2
   Private Const OPEN_EXISTING As Long = 3
   Private Const GENERIC_WRITE As Long = &H40000000
   Private Const GENERIC_READ As Long = &H80000000
   Private Const IOCTL_STORAGE_CHECK_VERIFY As Long = &H2D4800
   Private Const IOCTL_DISK_CHECK_VERIFY As Long = &H74800
   Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128
    End Type
    Private Type OVERLAPPED
        ternal As Long
        ternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
    End Type
    Private Enum IDE_DRIVE_NUMBER
        PRIMARY_MASTER
        PRIMARY_SLAVE
        SECONDARY_MASTER
        SECONDARY_SLAVE
    End Enum
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long

Private Sub Command1_Click()
    Dim OL As OVERLAPPED
    Dim retVal As Long
    Dim hDev As Long
    Dim lpcbBytesReturned As Long
    If IsWindowsNT Then
       hDev = CreateFile("\\.\D:", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
    Else
       hDev = CreateFile("\\.\D:", 0, 0, ByVal 0&, CREATE_NEW, 0, 0)
    End If
    retVal = DeviceIoControl(hDev, IOCTL_DISK_CHECK_VERIFY, ByVal 0, 0, ByVal 0, 0, lpcbBytesReturned, ByVal 0)
    If retVal <> 0 Then
        MsgBox "CD - Drive is ready", vbInformation, "Ready"
    Else
        MsgBox "CD - Drive is not ready", vbInformation, "Not ready"
    End If
    CloseHandle hDev
End Sub

Private Function IsWindowsNT() As Boolean
   Dim vInfo As OSVERSIONINFO
   vInfo.dwOSVersionInfoSize = Len(vInfo)
   If (GetVersionEx(vInfo)) = 0 Then Exit Function
   If vInfo.dwPlatformId = 2 Then IsWindowsNT = True
End Function

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам