c++ - 无法使用 C++ 中的 Windows 服务检索可移动设备上的数据

标签 c++ visual-studio-2010 service

我正在尝试检测可移动设备的插入并使用 NT 服务检索所述设备的驱动器号。我已成功检测到设备的插入和移除,但无法设置一个 DEV_BROADCAST_VOLUME 结构,该结构允许我从卷中获取驱动器号、GUID 等...。

case SERVICE_CONTROL_DEVICEEVENT:{
            switch(evtype){
            case DBT_DEVICEARRIVAL:{
                    DEV_BROADCAST_VOLUME *hdr = (DEV_BROADCAST_VOLUME*) evdata;
                    ofstream log ("C:\\log.txt", ios::app);
                    log << hdr->dbcv_devicetype;
                    log.close();
                }
                break;

上面的代码片段可以正确编译和运行,但是当我插入闪存驱动器时,hdr->dbcv_devicetype 记录为 55555DBT_DEVTYP_VOLUME(这是 USB 驱动器)被定义为 2(hdr->dbcv_devicetype 应该等于 DBT_DEVTYP_VOLUME 因为我插入了一个闪存驾驶)。由于某种原因,DBT_DEVTYP_VOLUME 未正确初始化,或者我正在做的其他事情是错误的。我正在使用 Windows 7 和 Visual Studio 2011 C++。

最佳答案

试试这个:

  PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)evdata;
  if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
   {
    PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

    if (lpdbv -> dbcv_flags & DBTF_MEDIA)
     {
      StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]), 
                       TEXT("Drive %c: Media has arrived.\n"), 
                       FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

      MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK );
     }
   }

   /*------------------------------------------------------------------
      FirstDriveFromMask( unitmask )

      Description
        Finds the first valid drive letter from a mask of drive letters.
        The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C, 
        and so on. A valid drive letter is defined when the 
        corresponding bit is set to 1.

      Returns the first drive letter that was found.
   --------------------------------------------------------------------*/

   char FirstDriveFromMask( ULONG unitmask )
    {
     char i;

     for (i = 0; i < 26; ++i)
      {
       if (unitmask & 0x1)
         break;
       unitmask = unitmask >> 1;
      }

     return( i + 'A' );
   }

代码来自 Detecting Media Insertion or Removal

关于c++ - 无法使用 C++ 中的 Windows 服务检索可移动设备上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8724890/

相关文章:

c++ - 找不到 PDB 'vc100.pdb'

android - 为什么要使用安卓服务?

linux - Xinetd 禁用标准错误重定向

c++ - 在只接触深度缓冲区的 openGL 中进行绘制调用

c++ - (C++) 关于语法的非常基本的问题

visual-studio-2010 - Fluent NHib 导致 Visual Studio 2010 在运行时挂起

.net - ASP.Net Web 服务响应时间慢

c++ - gsoap wsdl2h 在 wcf wsdl 文件上失败

c++ - 丢失唤醒 : What if the producer acquires the mutex first?

c++ - 如果名称包含 "update",Windows 会强制文件进行 UAC 提升?