我想檢測一個正在Windows服務中插入的USB磁盤驅動器,我已經將其作爲正常的Windows應用程序來完成。問題是以下代碼對於捲不起作用。檢測正在插入的USB驅動器 - Windows服務
註冊裝置通知:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
HDEVNOTIFY hDeviceNotify = NULL;
::ZeroMemory(¬ificationFilter, 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, ¬ificationFilter, 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應用程序?
什麼是不工作?幾個月前我做了這件事,並設法讓它工作。 – Luke 2010-04-14 16:32:48
我已經看過這個,並且無法獲得DBT_DEVTYP_VOLUME。檢查GUID是我使用的解決方法,就像你正在做的一樣。我可能很厚,但你想要達到什麼目的,檢查GUID不會給你? – snowcrash09 2010-04-14 16:49:55
我剛剛注意到您正在將它作爲DEV_BROADCAST_VOLUME投射;這是錯誤的。它是一個DEV_BROADCAST_DEVICEINTERFACE,您必須從設備名稱中獲取驅動器名稱。 – Luke 2010-04-14 17:02:26