tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: VolumeDeviceClassで「〜バッファが無効です」エラー
投稿日: 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 句に行ってしまいます。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。