掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数台あるCDトレイの開閉 (ID:115921)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
古いソースですが参考になればどうぞ '================================= '= ファイル(各種デバイス)を開く '================================= 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
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.