检测驱动器时如何修复此特定的System.NullReferenceException

时间:2016-11-29 19:00:17

标签: c#

固定:                     if(m.LParam!= null)                     { //所有代码 } 我有以下脚本检测USB闪存驱动器的插入和删除,我测试了visual studio以外的程序,它给了我一个nulreference exeption错误,System.NullReferenceException: 对象引用未设置为对象的实例。

错误给我的线是

      DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));

代码的全部内容是:

protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_DEVICECHANGE)
        {
            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))
            {
              //  MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
                notifyIcon1.BalloonTipText = "USB Drive with letter: " + DriveMaskToLetter(vol.dbcv_unitmask).ToString() + "Detected and will now copy. Press" + "insertuserselectedhotkeyasastringhere" + " To cancel";
                notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
                notifyIcon1.BalloonTipTitle = "USBAutoSave";
                notifyIcon1.ShowBalloonTip(3000);
            }
            if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
            {
                MessageBox.Show("usb out");
            }
        }
        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;
    }

    private static char DriveMaskToLetter(int mask)
    {
        char letter;
        string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C
        int cnt = 0;
        int pom = mask / 2;
        while (pom != 0)    // while there is any bit set in the mask shift it right        
        {
            pom = pom / 2;
            cnt++;
        }
        if (cnt < drives.Length)
            letter = drives[cnt];
        else
            letter = '?';
        return letter;
    }

0 个答案:

没有答案