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