2

私が間違っていることを教えてください。

「無効なデバイスSERVICE_CONTROL_DEVICEEVENT」を抜き差ししたときに通知されないのはなぜですか(つまり、デバイス マネージャーでデバイスを無効にします)。

デバイスが有効になっている場合、すべて正常に動作します。ここに私のソースコードがあります:

  • 登録通知:

    m_hServiceStatus = RegisterServiceCtrlHandlerEx(m_szServiceName, HandlerEx, NULL);
    if (m_hServiceStatus == NULL)
    {
        return;
    }
    
    DWORD dwState = SERVICE_START_PENDING;
    SetServiceStatus(m_hServiceStatus, &dwState);
    
    // Register device notification
    DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
    ZeroMemory( &notificationFilter, sizeof(notificationFilter) );
    notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    
    if(NULL == (m_hDevNotify = RegisterDeviceNotification(m_hServiceStatus, &notificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE|DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)))
    {
        return;
    }
    
  • HandlerEx関数:

    DWORD HandlerEx(DWORD dwOpcode, DWORD dwEventType, LPVOID lpEventData, LPVOID /*lpContext*/) throw()
    {
        DWORD dwRes = ERROR_CALL_NOT_IMPLEMENTED;
        switch (dwOpcode)
        {
        case SERVICE_CONTROL_STOP:
            if (m_hDevNotify)
            {
                UnregisterDeviceNotification(m_hDevNotify);
                m_hDevNotify = NULL;                
            }
            dwRes = NO_ERROR;
            break;
        case SERVICE_CONTROL_SHUTDOWN:
            if (m_hDevNotify)
            {
                UnregisterDeviceNotification(m_hDevNotify);
                m_hDevNotify = NULL;
            }
            dwRes = NO_ERROR;
            break;
        case SERVICE_CONTROL_DEVICEEVENT:
            {
                // ToDo: process event notification
                dwRes = NO_ERROR;
            }
            break;
        default:
            break;
        }
        return dwRes;
    }
    

事前に助けてくれてありがとう!

4

0 に答える 0