タイトル | : Re^2: VolumeDeviceClassで「〜バッファが無効です」エラー |
記事No | : 11421 |
投稿日 | : 2015/05/14(Thu) 21:27 |
投稿者 | : Kobaちゃん |
ご推測の通りSimon MourierさんのUsbEject.Libraryを使わせて頂いています。 掲示板用に修正して短くしましたが実際のコードは下記のとおりです。 よろしくお願いします。 ※Nothingの判定はNull文字が返ってくるので、vbNullに変えます。 アドバイスありがとうございます。
Imports System.Management ・ ・ Imports UsbEject.Library
Module EjectUsb
・ ・
Public Function Eject(ByVal VenNam As String, ByVal SN As String) As String Dim volumeDeviceClass As New VolumeDeviceClass() Dim DrvNam As String = "" Dim ChkMsg As String = "" Dim Res As String
Res = SetDrvNam(VenNam, SN, DrvNam) <- 挿入しているUSBのベンダ名とSNからドライブレターDrvNamを取得 If Res <> "OK" Then Eject = Res Exit Function End If
For Each device As Volume In volumeDeviceClass.Devices Application.DoEvents() If device.LogicalDrive = DrvNam Then ChkMsg = device.Eject(False) 'OKはNull文字、エラーはエラー内容を返す If ChkMsg = Nothing Then <- ここはChkMsg = vbNullに変えます。 ChkMsg = "OK" 'OKの場合は、OKに置き換える End If Exit For End If Next If ChkMsg = "" Then ChkMsg = DrvNam & " isn't in this PC" End If
Eject = ChkMsg
End Function
・ ・
End Module
※3年前に周りのPCはXpが主流で、Win7がまだ数台しかなかったころにXp/Win7 で確認していました。昨日久々動かしたのですが、当然のことながら周りのPC はWin7に全て切り替わっており(Win8はまだ未導入)特定のPCでエラーが出 ました。
> .NET Framework に、VolumeDeviceClass というクラスは用意されていなかったように > 思うのですが、それは自作されたクラスなのでしょうか? > (Simon Mourierさんの UsbEject Library のことかな…) > > > > Dim res as string > As や string が小文字になっているところをみると、 > 実際のコードの一部を切り出したというよりは、 > 掲示板投稿用に小改修したもののようですね。 > > > > Dim volumeDeviceClass As New VolumeDeviceClass() > > ↑ > > この時点でVolumeDeviceClass.Devices=要求された操作に対して与えられた > > バッファが無効ですとなっている > > それは ERROR_INVALID_USER_BUFFER というエラーですね。 > .NET のものというよりも、Windows API が用いるエラーメッセージであり、 > VB から意図的に発生させる場合には、 > Throw New System.ComponentModel.Win32Exception(1784) > のようなコードを使います。 > > > さしあたり、VolumeDeviceClass のクラス宣言を見せて下さい。 > (自作したものでは無いのなら、アセンブリの入手先や名前空間を教えてください) > > コンストラクタの呼び出し時(すなわち New した段階)でのエラーではなく、 > Devices というメンバー(フィールド? Function? Property?)へのアクセスで > 失敗しているのなら、そこに至るまでの部分に問題がありそうです。 > > > > if res=Nothing then > Nothing は = 演算子ではなく、Is 演算子もしくや IsNot 演算子でチェックしてください。 > > たとえば > Dim s1 As String = "" > Dim s2 As String = Nothing > Dim i3 As Integer? = 0 > Dim i4 As Integer? = Nothing > があった場合、Nothing なのは s2 と i4 ですよね。 > その 2 つを正しく判断するには、 > If x Is Nothing Then > の構文が必要となります。もしも > If x = Nothing Then > の構文にしてしまうと、s1、s2、i3 がヒットし、i4 は Else 句に行ってしまいます。
|