2

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 アプリケーションでは、dbch_devicetype で DBT_DEVTYP_VOLUME を取得できますが、これは Windows サービスの実装には存在しません。この問題の解決策を見たり聞いたりした人はいますか?

4

1 に答える 1

2

Windows 7 は「トリガー開始サービス」をサポートしています。サービスを開始し、スリープ ループを回って、何かが接続されるたびに反応する場合は、OS がサービスを開始するトリガー開始サービスを使用する方がよいと思います (Windows 7 がオプションであると仮定します)。 USB デバイスが接続されたとき (他にもトリガーがありますが、これについて言及しました)。

サンプル アプリケーション XP2Win7 ( http://code.msdn.microsoft.com/XP2Win7 ) には、この機能が含まれています。完全なソースコードが付属しています。ほとんどは VB と C# ですが、トリガー開始サービス部分は (ネイティブ) C++ です。

于 2010-04-14T15:58:46.720 に答える