VBでMO等のリムーバブルディスクの取り外しを行うには?

解決


かーくん  2002-12-30 21:18:51  No: 76748

みなさん、はじめまして。
現在、行きずまっており、質問させて下さい。
現在、USBのカードアダプターがあり、そこにataカードが刺さっています。
PC側からみるとリムーバブルディスクと認識されています。
このataカードを取り外す方法は、マニュアルには
1.マイコンピューターを開き、対象ドライブのプロパティーを開く
2.サブメニューの中の"取り外し"をクリック
3.アダプターのランプが消えているのを確かめ、ataカードを取り出す。
以上のよう書かれております。
VBで上記の2番、カードの"取り外し"を行いたいのですが、どう記述したら
よいのでしょうか?
よろしくお願いします。
VB6.0 sp5


魔界の仮面弁士  2003-01-01 01:36:57  No: 76749

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


かーくん  2003-01-06 18:21:45  No: 76750

魔界の仮面弁士さん、ありがとうございます。
早速挑戦してみます。
また、分からなかったら、ご面倒でもご教授よろしく
お願いします。


魔界の仮面弁士  2003-01-07 06:33:17  No: 76751

訂正。(;_;)

>   .EDX = &&H0
これは、「.EDX = &H0」ですね。

>   If l = 1 Then
上記は、「If l <> 0 Then」としてください。m(_ _)m


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

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






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