掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VBでMO等のリムーバブルディスクの取り外しを行うには? (ID:76749)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
MOのイジェクトをVBで書いた事はありますが…結構面倒でしたよ。 OSによって処理が異なりますので(NT系ではアンロックやディスマウント作業が必要) # 長くなるので、API関数や定数の宣言は省略させていただきます。 Win9X系: コードの詳細は、SDK/DDK、およびMSKBの文書番号168180を参考に。 With regs .EAX = &H440D .EBX = ドライブ番号(Aなら1、Zなら26) .ECX = &H849 .EDX = &&H0 End With h = CreateFile("\\.\vwin32", 0&, 0&, udtSECURITY_ATTRIBUTES, _ 0&, FILE_FLAG_DELETE_ON_CLOSE, 0&) DeviceIoControl h, VWIN32_DIOC_DOS_IOCTL, _ regs, Len(regs), regs, Len(regs), _ lngRet, udtOVERLAPPED 'ハンドルを閉じて後始末 CloseHandle h WinNT系: コードの詳細は、SDK/DDK、およびMSKBの文書番号165721を参考に。 D = ドライブレター("A"〜"Z"のいずれか一文字) h = CreateFile("\\.\" & D & ":", GENERIC_READ Or GENERIC_WRITE, _ FILE_SHARE_READ Or FILE_SHARE_WRITE, _ udtSECURITY_ATTRIBUTES, OPEN_EXISTING, 0&, 0&) If h = INVALID_HANDLE_VALUE Then 'CD-ROMドライブなどでは、READ/WRITEモードでは開けません。 '本当は、GetDriveType APIなどで、事前にドライブの判定を '行うべきなのでしょうけれども、面倒なので、READ/WRITEモードが '失敗したら、READモードで開きなおす…という手法にしています。 If h = INVALID_HANDLE_VALUE Then h = CreateFile("\\.\" & D & ":", GENERIC_READ, _ FILE_SHARE_READ Or FILE_SHARE_WRITE, _ udtSECURITY_ATTRIBUTES, OPEN_EXISTING, 0&, 0&) End If End If If h <> INVALID_HANDLE_VALUE Then 'ボリュームをロックします。なお、他のアプリがドライブを使用中だと、 'この呼び出しは失敗しますので、失敗時には、時間を置いて何回か 'FSCTL_LOCK_VOLUMEを呼び出しなおす(再試行処理を行う)ようにしても良いかも。 l = DeviceIoControl(h, FSCTL_LOCK_VOLUME, _ vbNullString, 0, vbNullString, 0, _ lngRet, udtOVERLAPPED If l = 1 Then 'ボリュームをアンマウントします。これにより、システムは 'このドライブに関する情報を破棄し、監視を行わなくなります。 l = DeviceIoControl(h, FSCTL_DISMOUNT_VOLUME, _ vbNullString, 0, vbNullString, 0, _ lngRet, udtOVERLAPPED) End If If l = 1 Then 'ドライブが削除可能か確認します。 'PREVENT_MEDIA_REMOVAL.PreventMediaRemoval として 0 をセットする事で、 'デバイスがメディアのイジェクトを拒否する事を防ぐ事ができます。 l = DeviceIoControl(h, IOCTL_STORAGE_MEDIA_REMOVAL, _ udtPREVENT_MEDIA_REMOVAL, Len(udtPREVENT_MEDIA_REMOVAL), _ vbNullString, 0, lngRet, udtOVERLAPPED) End If If l = 1 Then 'ようやく本題。メディアをイジェクトします。 DeviceIoControl h, IOCTL_STORAGE_EJEXT_MEDIA, _ vbNullString, 0, vbNullString, 0, _ lngRet, udtOVERLAPPED End If 'ハンドルを閉じて後始末 CloseHandle h End If
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.