はじめまして。只今、CDトレイのオープンクローズに苦戦しております。
やりたいことは、あるPCに複数台ドライブが設置されていて、指定したCDトレイを開閉したいと思っております。
なんか、超初心者な質問ですみませんが、ご存知の方ご教授よろしくお願い致します。
たぶんMCIコマンドあたりでできるのは、ないでしょうか?
http://homepage3.nifty.com/goldenchild/mci.htm
このへんとか。
>たぶんMCIコマンドあたりでできるのは、ないでしょうか?
たぶんMCIコマンドあたりでできるのでは、ないでしょうか?
>たぶんMCIコマンドあたりでできるのは、ないでしょうか?
>http://homepage3.nifty.com/goldenchild/mci.htm
>このへんとか。
すみません。ドライブを指定するところが見当たらなかったのですが、やっぱりドライブ指定でのCDトレイ開閉は無理なんでしょうか?
C:HDD
D:HDD
E:CDD
F:CDD
G:CDD
このようなドライブ構成になっていて、Fドライブを開閉させたり、Gドライブを開閉させたり、ドライブを指定したいと思っております。
MCIコマンドでドライブ指定実行は可能でしょうか?
・指定型 / 操作対象のドライブを指定します。
MCI書式 : "open " & Drive & " type cdaudio alias MusicAlias"
: Drive="D:\" など…
戻り値 : ret=[ 1 : 成功 / -1 : 失敗 ]
【2】CDドアを開く
MCI書式: "set MusicAlias door open"
戻り値 : ret=[ 0 : 可能 / -1 : 不可 ]
2つのコマンドでできないでしょうか?
>・指定型 / 操作対象のドライブを指定します。
> 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
> 【2】CDドアを開く
> MCI書式: "set MusicAlias door open"
ここも
MCI書式: "set cdrom door open"
ここに、その記述がありました・・・
http://www.e-douguya.com/eq/tech/mci.shtml
ご参考までに・・・
以上。
古いソースですが参考になればどうぞ
'=================================
'= ファイル(各種デバイス)を開く
'=================================
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
> 古いソースですが参考になればどうぞ
36NET さんって、空耳工房の ゆー太郎 さん ですか?
http://www.bea.hi-ho.ne.jp/my2project/vb/01/010206.htm
のサンプルとほぼ同じなので。
ところで、Win9x系だとメディアのロードができなかったような。
たぬきさん>
いや多分そこから拝借したものが自分に流れて来たと予想
しかしどうみても元のソースはそこっぽいですね
NTと2000のみで確認したから9xは動作未確認です
ツイート | ![]() |