powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с CD-ROM приводами
16 сообщений из 16, страница 1 из 1
Работа с CD-ROM приводами
    #33578641
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как решить на VB 6.0 с помощью API-функий такую задачу:
На ПК имеется 2-а или больше приводов CD-ROM, нужно обращаться оттдельно к каждому (например, открывать/закрывать лоток привода) или выполнять другие операции с выбранным приводом.

(нужно узнать ID каждого привода, а потом по этому номеру давать MCI команды, но как это всё делаеться?)
На форуме нашел подобное...
авторТема: CDROM Автор: KOLIK1 Дата: 29 апр 05, 02:39
но ответа там не нашел... :(
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33585588
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:( Ну как всегда, отвечать приходиться самому себе...
Нашел кое-что на сайте The Code Project...
Только вот, желательно на VB6 бы это и еще: есть аналог команды sizeof на VB...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void CDRomOpen(BOOL bOpenDrive, char *drive)
{ 
    MCI_OPEN_PARMS open;
    DWORD flags;

    ZeroMemory(&open, sizeof(MCI_OPEN_PARMS));

    open.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
    open.lpstrElementName = drive;

    flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID;

    if (!mciSendCommand( 0 , MCI_OPEN, flags, (DWORD) &open)) 
    {
        mciSendCommand(open.wDeviceID, MCI_SET, (bOpenDrive) ? 
                       MCI_SET_DOOR_OPEN : MCI_SET_DOOR_CLOSED,  0 );
        mciSendCommand(open.wDeviceID, MCI_CLOSE, MCI_WAIT,  0 );
    }
}
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33594071
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И опять таки, отвечаю себе любимому, хотя также и для тех, кого взаимно интересует данная тема - смотрите приложенный пример, открывать/закрывать любой из имеющихся приводов CD-ROM уже не проблема... ;)
http://]www.mentalis.org
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33594080
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да... еще, можно также открыть любой из приводов, таким способом, хотя понятия не имею как их закрыть обратно аналогичным способом...

Код: plaintext
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.
' This example requires one command button (Command1)
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile 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, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const INVALID_HANDLE_VALUE = - 1 
Private Const OPEN_EXISTING =  3 
Private Const FILE_FLAG_DELETE_ON_CLOSE =  67108864 
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const IOCTL_STORAGE_EJECT_MEDIA =  2967560 
Private Const VWIN32_DIOC_DOS_IOCTL =  1 
 
Private Type DIOC_REGISTERS
  reg_EBX As Long
  reg_EDX As Long
  reg_ECX As Long
  reg_EAX As Long
  reg_EDI As Long
  reg_ESI As Long
  reg_Flags As Long
End Type
 
Private Sub Command1_Click()
Dim hDrive As Long, DummyReturnedBytes As Long
Dim EjectDrive As String, DriveLetterAndColon As String
Dim RawStuff As DIOC_REGISTERS
  EjectDrive = InputBox("Which drive shall we try to eject the media from?", "Eject Media")
  If Len(EjectDrive) Then 'Confirm the user didn't cancel
    DriveLetterAndColon = UCase(Left$(EjectDrive & ":",  2 )) 'Make it all caps for easy interpretation
    If GetVersion >=  0  Then 'We are running Windows NT/2000
      hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE,  0 , ByVal  0 , OPEN_EXISTING,  0 ,  0 )
      If hDrive <> INVALID_HANDLE_VALUE Then
        'Eject media!
        Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA,  0 ,  0 ,  0 ,  0 , DummyReturnedBytes, ByVal  0 )
        Call CloseHandle(hDrive)  'Clean up after ourselves
      End If
    Else  'We are running Win9x/Me
      hDrive = CreateFile("\\.\VWIN32",  0 ,  0 , ByVal  0 ,  0 , FILE_FLAG_DELETE_ON_CLOSE,  0 )
      If hDrive <> INVALID_HANDLE_VALUE Then
        'Setup our raw registers to use Interrupt 21h Function 440Dh Minor Code 49h
        RawStuff.reg_EAX = &H440D   'The function to use
        RawStuff.reg_EBX = Asc(DriveLetterAndColon) - Asc("A") +  1  'The drive to do it on
        RawStuff.reg_ECX = &H49 Or &H800     'The minor code of the function in the low byte of the low word and the device category of 8 in the high byte of the low word
        'Eject media!
        Call DeviceIoControl(hDrive, VWIN32_DIOC_DOS_IOCTL, RawStuff, LenB(RawStuff), RawStuff, LenB(RawStuff), DummyReturnedBytes, ByVal  0 )
        Call CloseHandle(hDrive)  'Clean up after ourselves
      End If
    End If
  End If
End Sub
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33594082
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Слушайте, я еще не надоел самому себе? :))
Может кому-то еще полезно будет, в МСДН такое есть:

Using Multiple CD-ROM Drives on One Machine

ID: Q82469

--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Windows versions 3.0, 3.0a, 3.1, 3.11

--------------------------------------------------------------------------------



SUMMARY
By default, Microsoft Windows does not support using two CD-ROM drives to play CD Audio. However, by making a change to the SYSTEM.INI file, you can enable Windows to support using two CD-ROM drives to play CD Audio.

MORE INFORMATION
To enable support for two CD-ROM drives, use a text editor (for example, Notepad) to edit your SYSTEM.INI file as follows:

Under the [mci] section, which appears as

[mci]
CDAudio=mcicda.drv


add the line

CDAudio1=mcicda.drv

The edited section should appears as follows:

[mci]
CDAudio=mcicda.drv
CDAudio1=mcicda.drv1


This change enables drives that require the same driver, as well as those that require different drivers.

When you run Media Player, you should have two entries in the devices menu. You can select between the two entries to access your CD-ROM drives.
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33594172
DЭN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну коли ты шаришь что пишешь то
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33594705
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:) Да походу разбираюсь и сам... К тому же, я не такой скряга, мол узнал и зажал... а вдруг еще кому-то интересно, тема то горячая... чего пустовать будет. Помагай себе и другим... (надеюсь кто-то тем же ответит)...
А если есть чего сказать по делу... говори плиз, с удовольствием пообщаемся... ;)
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33598190
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не осудите меня, что так резво сам с собой разгавариваю... таки для людей стараюсь... Вот сдесь, то что нужно, открыть/закрыть любой привод:

Добавь кнопку и скопируй в код формы:
Код: plaintext
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.
Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long
Private Declare Function GetVersion Lib "kernel32" () As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile 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, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const INVALID_HANDLE_VALUE = - 1 
Private Const OPEN_EXISTING =  3 
Private Const FILE_FLAG_DELETE_ON_CLOSE =  67108864 
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const IOCTL_STORAGE_EJECT_MEDIA = &H2D4808
Private Const IOCTL_STORAGE_LOAD_MEDIA = &H2D480C
Private Const VWIN32_DIOC_DOS_IOCTL =  1 

Private Type DIOC_REGISTERS
reg_EBX As Long
reg_EDX As Long
reg_ECX As Long
reg_EAX As Long
reg_EDI As Long
reg_ESI As Long
reg_Flags As Long
End Type

Private Sub CD_Eject(ByVal Drive As String)
Dim hDrive As Long, DummyReturnedBytes As Long
Dim EjectDrive As String
Dim RawStuff As DIOC_REGISTERS

Drive = UCase(Left$(Drive & ":",  2 ))
If GetVersion >=  0  Then ' Запущена Windows NT/2000
hDrive = CreateFile("\\.\" & Drive, GENERIC_READ Or GENERIC_WRITE,  0 , ByVal  0 , OPEN_EXISTING,  0 ,  0 )
If hDrive <> INVALID_HANDLE_VALUE Then
DeviceIoControl hDrive, IOCTL_STORAGE_EJECT_MEDIA,  0 ,  0 ,  0 ,  0 , DummyReturnedBytes, ByVal  0 
CloseHandle hDrive
End If
Else 'Запущена Windows 9x/Me
hDrive = CreateFile("\\.\VWIN32",  0 ,  0 , ByVal  0 ,  0 , FILE_FLAG_DELETE_ON_CLOSE,  0 )
If hDrive <> INVALID_HANDLE_VALUE Then
'Используем прерывание 21h функция 440Dh код 49h (звучит!)
RawStuff.reg_EAX = &H440D
RawStuff.reg_EBX = Asc(Drive) - Asc("A") +  1  ' Номер диска
RawStuff.reg_ECX = &H49 Or &H800
DeviceIoControl hDrive, VWIN32_DIOC_DOS_IOCTL, RawStuff, LenB(RawStuff), RawStuff, LenB(RawStuff), DummyReturnedBytes, ByVal  0 
CloseHandle hDrive
End If
End If
End Sub

Private Sub Command1_Click()
CD_Eject "e" ' откроется диск E:
CD_Eject "f" ' откроется диск F:
End Sub

Удачи всем! ;)
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33603787
Angel-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хех, не всё так гладко, заметил не очень хорошую особенность вышеприведенного кода - открываются/закрываются все CD-ROM драйвы кроме того, из которого был запущен этот код. Т.е. если запускаем нашу программу из CD-ROMа E: и даем команду открыть/закрыть его же - функция не дейсвтвует, одна из CD-ROM E: можно открыть/закрыть все остальные CD-ROM приводы. Кто поделится, как кодом открывать/закрывать привод из которого этот код был запущен??? Ребята, помогите...
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33626246
Сегодня случайно наткнулся на один пример.

Подключаем библиотеки:
- Microsoft Scripting Runtime.
- Windows Media Player.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim fso As New Scripting.FileSystemObject
Dim drv As Scripting.drive
Dim wmp As New WMPLib.WindowsMediaPlayer
Dim intCount As Integer

Sub OpenCloseCd()
    intCount = - 1 
    
    ' Открываем все сидюки.
    ' Если запустить еще раз после открытия, то закрываем.
    For Each drv In fso.Drives
        If drv.DriveType =  4  Then
            intCount = intCount +  1 
            wmp.cdromCollection.Item(intCount).eject
        End If
    Next drv
End Sub
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #33626339
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О как, блин! Надо будет винампом попробовать открыть. Или Оперой... :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Работа с CD-ROM приводами
    #35032970
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему чтобы новые не плодить.
Если диск отформатирован для пакетной записи, например InCD4, то такой диск не эджектится!
Буду признателен за помощь в этой проблеме.
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #35033052
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #35033136
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One http://vbnet.mvps.org/index.html?code/disk/devioejectload.htm
Не пашет для пакетных дисков.
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #35033163
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у тебя он вообще из explorer>правый клик на устройстве>eject открывается?
...
Рейтинг: 0 / 0
Работа с CD-ROM приводами
    #35033413
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том-то и дело что да. И еще, если вставить простой сидюк то код работает, если сидюк отформатированный для пакетной записи то не пашет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с CD-ROM приводами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]