みなさん、はじめまして。
現在、行きずまっており、質問させて下さい。
現在、USBのカードアダプターがあり、そこにataカードが刺さっています。
PC側からみるとリムーバブルディスクと認識されています。
このataカードを取り外す方法は、マニュアルには
1.マイコンピューターを開き、対象ドライブのプロパティーを開く
2.サブメニューの中の"取り外し"をクリック
3.アダプターのランプが消えているのを確かめ、ataカードを取り出す。
以上のよう書かれております。
VBで上記の2番、カードの"取り外し"を行いたいのですが、どう記述したら
よいのでしょうか?
よろしくお願いします。
VB6.0 sp5
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
魔界の仮面弁士さん、ありがとうございます。
早速挑戦してみます。
また、分からなかったら、ご面倒でもご教授よろしく
お願いします。
訂正。(;_;)
> .EDX = &&H0
これは、「.EDX = &H0」ですね。
> If l = 1 Then
上記は、「If l <> 0 Then」としてください。m(_ _)m