关于u盘识别(OnDeviceChange方式)的几个小问题,请问

关于u盘识别(OnDeviceChange方式)的几个问题,请教!
烦请高手帮忙,这个问题把我弄得好憔悴,我的代码骨架如下:

[code=C/C++][/code]

LRESULT CHWDetectDlg::OnMyDeviceChange(UINT nEventType,DWORD dwData)
{
  PDEV_BROADCAST_HDR dbd = (PDEV_BROADCAST_HDR) dwData;  
  switch (nEventType)
  {
  case DBT_DEVICEREMOVECOMPLETE:
  ...
  break;
  case DBT_DEVICEARRIVAL: //问题点在这个分支下
  switch( dbd ->dbch_devicetype )
  {
  case DBT_DEVTYP_DEVICEINTERFACE:
  PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)dbd ;
  //这种情况下如何读出盘符???
  break;
  case DBT_DEVTYP_VOLUME:
  PDEV_BROADCAST_VOLUME pDevInf = (PDEV_BROADCAST_VOLUME)dbd ;
   
  break;

  default:
  break;

  }

  ...
  break;
  default:
  break;
  }

return TRUE;

}





问题一、在响应u盘的插入消息后(DBT_DEVICEARRIVAL),在判断dbd ->dbch_devicetype 时,网上找的代码都直接走到“case DBT_DEVTYP_VOLUME:“这个分支,而我自己的代码却走向却是”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况。为什么同样的事件,触发的逻辑走向不一样呢?

问题二、在”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况下,我想得到插入u盘的盘符,我该怎样实现呢??

问题三、在设备注册过程中,代码如下:
DEV_BROADCAST_DEVICEINTERFACE DevInt;
memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInt.dbcc_classguid = GetCurrentUSBGUID();//m_usb->GetDriverGUID();
if (!RegisterDeviceNotification(m_hWnd, &DevInt,DEVICE_NOTIFY_WINDOW_HANDLE) )
  return FALSE;

红色字体行,“dbcc_devicetype ”可改成其他值吗,比如PDEV_BROADCAST_VOLUME,还是固定值???

感谢!

------解决方案--------------------
怎么不重载WindowProc?
C/C++ code

LRESULT CXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    // TODO: Add your specialized code here and/or call the base class
    DWORD ThreadId;
    bool allzero=true;
    size_t i;

    if(message!=WM_DEVICECHANGE)
    {
        return CDialog::WindowProc(message, wParam, lParam);
    }

    if(wParam==DBT_DEVICEARRIVAL)//有新设备插入系统
    {
        DEV_BROADCAST_HDR* pDev=(DEV_BROADCAST_HDR*)lParam;
        if(pDev->dbch_devicetype!=DBT_DEVTYP_VOLUME )//移动存储设备
        {
            return CDialog::WindowProc(message, wParam, Param);
        }

        DEV_BROADCAST_VOLUME* pDisk=(DEV_BROADCAST_VOLUME*)lParam;
        DWORD mask=pDisk->dbcv_unitmask;

        TCHAR diskname[MAX_PATH];
        for(i=0;i<32;i++)
        {
            if((mask>>i)==1)
            {//获取盘符
                diskname[0]='A'+i;
                diskname[1]='\0';
                _tcscat_s(diskname,TEXT(":\\"));
                break;
            }
        }
    }
}

------解决方案--------------------
读出盘符 我记得好像有API的,记得不太清楚。
------解决方案--------------------
9楼,你在6楼都引用了
Volume notifications are also broadcast to top-level windows
应该是,即使不注册,也会发送该消息。

而且注册 DBT_DEVTYP_DEVICEINTERFACE 后,首先进入的是 DBT_DEVTYP_DEVICEINTERFACE 分支,因为是U盘,所以有“USB设备”“磁盘类”的子消息进来,根据 8楼的GUID数组,跟着还是会进入 DBT_DEVTYP_VOLUME 的

至于9楼第一个问题,这个说起来就麻烦了,你用窗口消息的话,就不用考虑这个途径了。