0

私は自分のプログラムの準備がほぼ整っていますが、それはかなりスムーズに実行されると思いました。たまたまusb-arrivalをチェックして、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」ことに気づきました。winmsgとともに到着するはずの構造を読み取るときに私にスローされます。USBの接続とプルで3〜4個のNullreferenceエラーが発生します。

私は何が間違っているのですか?

public partial class Form1 : Form
{
    private const int WM_DEVICECHANGE = 0x0219;
    private const int DBT_DEVICEARRIVAL = 0x8000;
    private const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
    private const int DBT_DEVTYPVOLUME = 0x00000002;

    public Form1()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_DEVICECHANGE)
        {
            try
            {
                Debug.WriteLine("trying");
                DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));

                if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
                {
                    Debug.WriteLine("usb in");
                    //NewStickArrived(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
                }
                if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
                {
                    Debug.WriteLine("usb out");
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }
        }
        base.WndProc(ref m);
    }

    [StructLayout(LayoutKind.Sequential)] //Same layout in mem
    public struct DEV_BROADCAST_VOLUME
    {
        public int dbcv_size;
        public int dbcv_devicetype;
        public int dbcv_reserved;
        public int dbcv_unitmask;
    }

}

}

この例を試すには、次のことも必要です。

using System.Diagnostics;
using System.Runtime.InteropServices;

1.構造体についてまだよく知らないので、構造体に何か問題があります。または2.時々この "[...] Marshal.PtrToStructure(m.LParam [...] 「構造体に適合しません...

ありがとう

4

0 に答える 0