|
Message.lParam에 이벤트를 발생시킨 디바이스 정보(DEV_BROADCAST_HDR 구조체)가 들어옵니다.
위 정보로 디바이스를 확인하신 후에 제어하고자 하는 Device일 때, DBT_DEVICEARRIVAL, DEVICEREMOVECOMPLETE 메세지를 처리하세요.
디바이스를 확인하지 않으시고 메세지를 처리하시기 때문에 질문하신 문제가 생긴겁니다.
win 님이 쓰신 글 :
: 안녕하세요.
:
: C++ 빌더 사용 유저입니다.
:
: 제가 지금 프로그램을 하나 만들고 있는데 갑자기 막히는 부분이 있어서..
: 도움 좀 청하고자 글 올립니다.
:
: 아래처럼 USB 이벤트를 사용하고 있는데요. (검색하면서 찾아낸 소스입니다^^:)
:
: 저도 아래 소스처럼 프로그램을 짰는데..
: 여러 USB 포트를 사용하다보니 문제가 생겼어요.
:
: 제 문제는 "DBT_DEVICEREMOVECOMPLETE" 부분입니다.
:
: " 통신 중인 USB 포트가 아닌 다른 케이블을 빼도 통신이 종료가 됩니다. "
:
: 저 부분을 사용하지 않으면..
: 통신이 끊겼을 경우, 프로그램이 DOWN 되기 때문에 통신 종료를 해주는 부분은 꼭 필요합니다..
:
: 빠진 케이블이 현재 통신중인 케이블인지 아닌지 확인 하는 방법있을까요?..
:
:
: : : : void __fastcall TComPortForm::OnMessages(Messages::TMessage &Message)
: : : : {
: : : : switch(Message.Msg)
: : : : {
: : : : case WM_DEVICECHANGE:
: : : : switch(Message.WParam)
: : : : {
: : : : case DBT_DEVICEARRIVAL :
: : : : CheckPort(); // 핸드폰 케이블이 꼽혔다. 꼽힌 핸드폰 USB Serial port 번호 찻아서 해당포트 open하기.
: : : : break;
: : : : case DBT_DEVICEREMOVECOMPLETE :
: : : : ComPort1->Close(); // // 핸드폰 케이블이 빠졌다. 포트 뒷 정리.
: : : : break;
: : : : }
: : : : Message.Result = true;
: : : : break;
: : : : default:
: : : : TForm::WndProc(Message);
: : : : }
: : : : }
|