複数台あるCDトレイの開閉


DASAKURA  2004-08-27 19:14:23  No: 115913

はじめまして。只今、CDトレイのオープンクローズに苦戦しております。
やりたいことは、あるPCに複数台ドライブが設置されていて、指定したCDトレイを開閉したいと思っております。
なんか、超初心者な質問ですみませんが、ご存知の方ご教授よろしくお願い致します。


TMQ  2004-08-27 21:57:08  No: 115914

たぶんMCIコマンドあたりでできるのは、ないでしょうか?

http://homepage3.nifty.com/goldenchild/mci.htm
このへんとか。


TMQ  2004-08-27 21:59:54  No: 115915

>たぶんMCIコマンドあたりでできるのは、ないでしょうか?

たぶんMCIコマンドあたりでできるのでは、ないでしょうか?


DASAKURA  2004-08-27 22:11:46  No: 115916

>たぶんMCIコマンドあたりでできるのは、ないでしょうか?
http://homepage3.nifty.com/goldenchild/mci.htm
>このへんとか。

すみません。ドライブを指定するところが見当たらなかったのですが、やっぱりドライブ指定でのCDトレイ開閉は無理なんでしょうか?

C:HDD
D:HDD
E:CDD
F:CDD
G:CDD

このようなドライブ構成になっていて、Fドライブを開閉させたり、Gドライブを開閉させたり、ドライブを指定したいと思っております。
MCIコマンドでドライブ指定実行は可能でしょうか?


TMQ  2004-08-27 22:30:08  No: 115917

・指定型  /  操作対象のドライブを指定します。
    MCI書式  :  "open " & Drive & " type cdaudio alias MusicAlias"
              :  Drive="D:\" など…
    戻り値  :  ret=[  1 : 成功  /  -1 : 失敗  ]

  【2】CDドアを開く
    MCI書式:  "set MusicAlias door open"
    戻り値   :  ret=[  0 : 可能  /  -1 : 不可  ]

2つのコマンドでできないでしょうか?


TMQ  2004-08-27 22:38:31  No: 115918

>・指定型  /  操作対象のドライブを指定します。
>    MCI書式  :  "open " & Drive & " type cdaudio alias MusicAlias"
     MCI書式  :  "open " & Drive & " type cdaudio alias cdrom"
かも。

あとは、Googleなどでしらべてください。
http://www.devhood.com/messages/message_view-2.aspx?thread_id=35710


TMQ  2004-08-27 22:40:01  No: 115919

>  【2】CDドアを開く
>    MCI書式:  "set MusicAlias door open"
ここも
    MCI書式:  "set cdrom door open"


岡田 之仁  2004-08-29 20:51:40  No: 115920

ここに、その記述がありました・・・

http://www.e-douguya.com/eq/tech/mci.shtml

ご参考までに・・・

以上。


36NET  2004-08-30 17:45:05  No: 115921

古いソースですが参考になればどうぞ

'=================================
'= ファイル(各種デバイス)を開く
'=================================
Declare Function CreateFile _
        Lib "kernel32" Alias "CreateFileA" _
            (ByVal lpFileName As String, _
                ByVal dwDesiredAccess As Long, _
                ByVal dwShareMode As Long, _
                lpSecurityAttributes As SECURITY_ATTRIBUTES, _
                ByVal dwCreationDisposition As Long, _
                ByVal dwFlagsAndAttributes As Long, _
                ByVal hTemplateFile As Long) As Long

'=======================
'= CreateFile関連構造体
'=======================
Type SECURITY_ATTRIBUTES
     nLength                        As Long
     lpSecurityDescriptor           As Long
     bInheritHandle                 As Boolean
End Type

'=====================
'= CreateFile固定引数
'=====================
Public Const GENERIC_READ           As Long = &H80000000
Public Const FILE_SHARE_READ        As Long = &H1
Public Const OPEN_EXISTING          As Long = 3

'=====================
'= CreateFileエラー返値
'=====================
Public Const INVALID_HANDLE_VALUE   As Long = -1

'===================
'= デバイス間I/O制御
'===================
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 OVERLAPPED) As Long

'===========================
'= DeviceIoControl関連構造体
'===========================
Type OVERLAPPED
     Internal       As Long
     InternalHigh   As Long
     offset         As Long
     OffsetHigh     As Long
     hEvent         As Long
End Type

Type DevIoCtrlRegs
     EBX As Long
     EDX As Long
     ECX As Long
     EAX As Long
     EDI As Long
     ESI As Long
     flg As Long
End Type

'==================
'= ハンドルを閉じる
'==================
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'=============================
'= Windowsバージョンを取得する
'=============================
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long

'========================
'= GetVersionEx関連構造体
'========================
Type OSVERSIONINFO
     dwOSVersionInfoSize    As Long         '= この構造体のバイト数
     dwMajorVersion         As Long         '= バージョン番号
     dwMinorVersion         As Long         '= マイナーリビジョン番号
     dwBuildNumber          As Long         '= ビルド番号
     dwPlatformId           As Long         '= プラットホーム
     szCSDVersion           As String * 128 '= OSに関する説明
End Type

'= dwPlatformId の戻り値
Public Const VER_PLATFORM_WIN32_NT      As Long = 2 'WinNT

Public Const FILE_DEVICE_MASS_STORAGE   As Long = &H2D
Public Const IOCTL_STORAGE_BASE         As Long = FILE_DEVICE_MASS_STORAGE
Public Const METHOD_BUFFERED As Long = 0
Public Const FILE_READ_ACCESS As Long = &H1

Public Const IOCTL_STORAGE_EJECT_MEDIA As Long = &H2D4808
Public Const IOCTL_STORAGE_LOAD_MEDIA As Long = &H2D480C

Public Sub Y_EjectDisk(ByVal Drv As String)
'***********************************************************
'機能: 指定したドライブをイジェクトする
'引数: Drv = ドライブ名
'備考: 指定したドライブが自動イジェクト機構を持っていなければ
'      作動しません。
'      デバイスがロックされている時も作動しません。
'***********************************************************

     Dim Over As OVERLAPPED
     Dim DevIoCtrlReg As DevIoCtrlRegs
     Dim Security As SECURITY_ATTRIBUTES
     Dim hDevice As Long
     Dim BytesReturned As Long
     Dim drvNo As Long
     Dim DrvName As String
     Dim NTFlg As Boolean
     Dim longret As Long

     Drv = StrConv(Left$(Drv, 1), vbUpperCase)
     drvNo = Asc(Drv) - 64

     If drvNo >= 1 And drvNo <= 26 Then
         NTFlg = Y_IsNT()

         If NTFlg Then
             DrvName = "\\.\" & Drv & ":"
         Else
             DrvName = "\\.\vwin32"

         End If
     'デバイスオープン
         hDevice = CreateFile(DrvName, GENERIC_READ, FILE_SHARE_READ, Security, OPEN_EXISTING, 0, 0)

         If hDevice <> INVALID_HANDLE_VALUE Then
     'メディアイジェクト
             If NTFlg Then 'NT
                 longret = DeviceIoControl(hDevice, IOCTL_STORAGE_LOAD_MEDIA, vbNullString, _
                0, vbNullString, 0, BytesReturned, Over)
             Else 'Win95,98
     '仮想デバイスドライバを通して Int21h Function 440Dh Minor Code 49hを実行
                 With DevIoCtrlReg
                     .EAX = &H440D
                     .EBX = drvNo
                     .ECX = &H849
                     .EDX = 0
                 End With
                 longret = DeviceIoControl(hDevice, 1, DevIoCtrlReg, Len(DevIoCtrlReg), DevIoCtrlReg, _
                Len(DevIoCtrlReg), BytesReturned, Over)
             End If

         'デバイスを閉じる
             longret = CloseHandle(hDevice)
         End If
     End If

End Sub

Public Function Y_IsNT() As Boolean
'***********************************************************
'機能  :  WindowsNTかを判断する
'戻り値: True = NT False = その他
'***********************************************************

     Dim longret As Long
     Dim info As OSVERSIONINFO

     info.dwOSVersionInfoSize = Len(info)

     longret = GetVersionEx(info)
     Y_IsNT = (info.dwPlatformId = VER_PLATFORM_WIN32_NT)

End Function


たぬき  2004-08-30 20:33:07  No: 115922

> 古いソースですが参考になればどうぞ

36NET さんって、空耳工房の ゆー太郎 さん ですか?
http://www.bea.hi-ho.ne.jp/my2project/vb/01/010206.htm
のサンプルとほぼ同じなので。

ところで、Win9x系だとメディアのロードができなかったような。


36NET  2004-08-30 21:53:37  No: 115923

たぬきさん>
いや多分そこから拝借したものが自分に流れて来たと予想
しかしどうみても元のソースはそこっぽいですね
NTと2000のみで確認したから9xは動作未確認です


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加