2010-04-14 153 views
2

我想檢測一個正在Windows服務中插入的USB磁盤驅動器,我已經將其作爲正常的Windows應用程序來完成。問題是以下代碼對於捲不起作用。檢測正在插入的USB驅動器 - Windows服務

註冊裝置通知:

DEV_BROADCAST_DEVICEINTERFACE notificationFilter; 
    HDEVNOTIFY hDeviceNotify = NULL;   

    ::ZeroMemory(&notificationFilter, sizeof(notificationFilter)); 

    notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
    notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
    notificationFilter.dbcc_classguid = ::GUID_DEVINTERFACE_VOLUME; 

    hDeviceNotify = ::RegisterDeviceNotification(g_serviceStatusHandle, &notificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE); 

從ServiceControlHandlerEx函數的代碼:

case SERVICE_CONTROL_DEVICEEVENT: 
    PDEV_BROADCAST_HDR pBroadcastHdr = (PDEV_BROADCAST_HDR)lpEventData; 

    switch (dwEventType) 
    { 
    case DBT_DEVICEARRIVAL: 
     ::MessageBox(NULL, "A Device has been plugged in.", "Pounce", MB_OK | MB_ICONINFORMATION); 

     switch (pBroadcastHdr->dbch_devicetype) 
     { 
     case DBT_DEVTYP_DEVICEINTERFACE: 
      PDEV_BROADCAST_DEVICEINTERFACE pDevInt = (PDEV_BROADCAST_DEVICEINTERFACE)pBroadcastHdr; 

      if (::IsEqualGUID(pDevInt->dbcc_classguid, GUID_DEVINTERFACE_VOLUME)) 
      { 
       PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)pDevInt; 

       char szMsg[80]; 
       char cDriveLetter = ::GetDriveLetter(pVol->dbcv_unitmask); 

       ::wsprintfA(szMsg, "USB disk drive with the drive letter '%c:' has been inserted.", cDriveLetter); 
       ::MessageBoxA(NULL, szMsg, "Pounce", MB_OK | MB_ICONINFORMATION); 
      } 
     } 

     return NO_ERROR; 
    } 

在Windows應用程序,我能得到DBT_DEVTYP_VOLUME在dbch_devicetype,但是這不存在在Windows服務實現中。有沒有人看到或聽說過這個問題的解決方案,沒有明顯的重寫爲Windows應用程序?

+0

什麼是不工作?幾個月前我做了這件事,並設法讓它工作。 – Luke 2010-04-14 16:32:48

+1

我已經看過這個,並且無法獲得DBT_DEVTYP_VOLUME。檢查GUID是我使用的解決方法,就像你正在做的一樣。我可能很厚,但你想要達到什麼目的,檢查GUID不會給你? – snowcrash09 2010-04-14 16:49:55

+1

我剛剛注意到您正在將它作爲DEV_BROADCAST_VOLUME投射;這是錯誤的。它是一個DEV_BROADCAST_DEVICEINTERFACE,您必須從設備名稱中獲取驅動器名稱。 – Luke 2010-04-14 17:02:26

回答

2

Windows 7支持「觸發啓動的服務」。如果你想開始你的服務,在睡眠循環中回顧一下,並且在插入任何東西時做出反應,我認爲你會更好(假設Windows 7是一個選項),並在啓動服務的情況下啓動服務當有USB設備插入時(還有其他觸發器,但您提到過這個)

示例應用程序XP2Win7(http://code.msdn.microsoft.com/XP2Win7)包含此功能。它帶有完整的源代碼。大部分是在VB和C#中,但觸發器開始的服務部分是(本地)C++。

+0

不幸的是,我不想將我的服務僅限於Windows 7。 – 2010-04-14 16:29:25

相關問題