재부팅할 때까지 Windows 볼륨 장치 감지에 실패했습니다.한번도 실패하지 않은
문제
USB 플래시 드라이브의 볼륨 연결을 감지하는 코드가 있습니다.코드는 한동안 매우 잘 작동했지만 최근 동료 엔지니어의 컴퓨터에 오류가 발생하기 시작하여 다시 시작할 때까지 다시 제대로 작동하지 않았습니다.
이 프로젝트는 Qt 4.5.0을 사용하지만 이 질문과 그다지 관련이 없어야 합니다.
다음과 같이 알림을 등록합니다
// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;
m_hDeviceNotify =
RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );
그런 다음 처리기는 WM_DEVICECHANGE 메시지를 필터링합니다.
if (message->message == WM_DEVICECHANGE)
{
switch (message->wParam)
{
case DBT_DEVICEARRIVAL:
HandleVolumeArrival( message );
break;
case DBT_DEVICEREMOVECOMPLETE:
HandleVolumeRemoval( message );
break;
default:
break;
}
*result = TRUE;
} // end if
그런 다음 도착 메시지 처리기는 메시지를 다음과 같이 처리합니다.
void handlevolumearrival (msg *message) {if (message-> lparam == 0) {qdebug () << "lparam은 장치 도착시 0입니다";반품;} // 종료되는 경우
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) message->lParam;
if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME) pHdr;
// Handling of the volume is performed here
} // end if
} // HandleVolumeArrival 종료
볼륨 유형에 대한 장치 유형을 확인할 때 문제가 발생했습니다.
pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME
실패했을 때 장치 유형은 다음과 같이 보고되었습니다. DBT_DEVTYP_DEVICEINTERFACE
.
여러 USB 드라이브를 시도했지만 모두 동일한 문제가 발생했습니다.
전에 이런 것을 본 사람이 있나요?문제의 원인이 무엇인지, 시스템을 다시 시작하면 문제가 사라지는 이유를 알고 계십니까?
해결책
내 추측은 당신이 볼 것입니다 DBT_DEVTYP_DEVICEINTERFACE
어쨌든 일반적으로.USB 장치는 자체 설명적입니다.USB 장치에는 각 인터페이스가 장치의 기능인 모든 "인터페이스"가 있을 수 있습니다.내 생각엔 USB를 연결하면 "DBT_DEVTYP_DEVICEINTERFAC
USB 장치 드라이버가 해당 USB 인터페이스를 처리할 수 있다고 말할 수 있도록 USB 장치 인터페이스당 E"를 지정합니다.USB 대용량 저장 장치 드라이버용 USB 장치 드라이버가 볼륨을 마운트하여 이 메시지를 처리한 다음 DBT_DEVTYP_VOLUME
메시지.
대용량 저장 장치 인터페이스 드라이버가 올바르게 작동하지 않거나 충돌하여 다음을 처리하지 못하는 것 같습니다. DBT_DEVTYP_DEVICEINTERFACE
.많이 보기 시작하지 않는 한 굳이 굳이 감당해야 할 상황은 아닌 것 같아요.