【发布时间】:2019-10-13 22:11:24
【问题描述】:
我基本上想做的是制作一个监听存储设备插入的 Windows 服务,例如(USB 闪存驱动器、外部 HDD/SSD)...... 我正在关注这两个教程:
- https://www.codeproject.com/Articles/15612/Receiving-Device-Event-Notification-in-Windows-Ser
- https://docs.microsoft.com/en-us/windows/win32/devio/detecting-media-insertion-or-removal
我的服务部分运行正常,我也收到了设备通知。
但是当我尝试放入 USB 闪存驱动器时,我收到了一个通知,但
dbch_devicetype 在 PDEV_BROADCAST_HDRis总是DBT_DEVTYP_DEVICEINTERFACE 从不DBT_DEVTYP_VOLUME。此外,当我 RegisterDeviceNotification 和 DBT_DEVTYP_VOLUME 时,我什么也没有收到。我已经搜索了几个小时,但找不到为什么我没有收到正确的通知负责为设备通知注册服务的功能:
void Myclassname::registerForDeviceNotifications() {
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
m_hDevNotify = RegisterDeviceNotification(m_statusHandle,
&NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE |
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
}
负责处理设备通知的函数:
void AutobackupService::handleDeviceChangeNotif(DWORD dwEventType, LPVOID lpEventData) {
switch (dwEventType) {
case DBT_DEVICEREMOVECOMPLETE: {
PDEV_BROADCAST_HDR eventData = (PDEV_BROADCAST_HDR)lpEventData;
logToFile(std::to_string(eventData->dbch_devicetype));
if (eventData->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)eventData;
if (lpdbv->dbcv_flags & DBTF_MEDIA)
{
WriteEventLogEntry(L"USB device removed " + lpdbv->dbcv_unitmask, EVENTLOG_INFORMATION_TYPE);
}
}
}
break;
case DBT_DEVICEARRIVAL: {
PDEV_BROADCAST_HDR eventData = (PDEV_BROADCAST_HDR)lpEventData;
logToFile(std::to_string(eventData->dbch_devicetype));
if (eventData->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)eventData;
if (lpdbv->dbcv_flags & DBTF_MEDIA)
{
WriteEventLogEntry(L"USB device removed " + lpdbv->dbcv_unitmask, EVENTLOG_INFORMATION_TYPE);
}
}
}
}
}
【问题讨论】:
-
你必须得到
dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE,因为你注册了NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;,你需要使用NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_VOLUME而不是GUID_DEVCLASS_VOLUME -
@RbMm 我尝试使用
GUID_DEVINTERFACE_VOLUME但它不起作用(我收到了闪存驱动器的通知,但它也将鼠标注册为存储设备) -
因为你的代码错误太多
-
@RbMm 没有代码编译正常
-
这里的代码编译方式有什么关系?
标签: c++ winapi windows-services