Определить вставляемый USB-накопитель - Служба Windows - PullRequest
2 голосов
/ 14 апреля 2010

Я пытаюсь обнаружить, что USB-накопитель вставлен в Службу Windows, я сделал это как обычное приложение 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?

1 Ответ

2 голосов
/ 14 апреля 2010

Windows 7 поддерживает «триггерные службы».Если вы хотите запустить свой сервис, обойти его в спящем цикле и реагировать всякий раз, когда что-то подключено, я думаю, вам будет лучше (если предположить, что Windows 7 является опцией), если вы используете сервис, запускаемый триггером, когда ОС запускает сервискогда устройство USB подключено. (Есть и другие триггеры, но вы упомянули этот.)

Пример приложения XP2Win7 (http://code.msdn.microsoft.com/XP2Win7) включает в себя эту функцию. Он поставляется с полным исходным кодом. Большинство из нихв VB и C #, но запущенная триггером часть служб находится в (родном) C ++.

...