C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47805] Re:[질문] USB 장치 제거 및 삽입 상태 파악할려는데요.. ㅜㅜ
[] 3183 읽음    2007-01-18 17:56
나그네 님이 쓰신 글 :
: 안녕하세요..
:
: 항상 좋은 정보를 얻어가고 있습니다.
:
: 다름이 아니라,
:
: 이번에 여러개의 USB 장치(개발된 장치) 와 통신을 해야 하는데요,,
:
: 제가 궁금한 점은,
:
: 프로그램을 실행시켰을 때, USB상태를 파악해야 하고요,
:
: 프로그램 실행중 제거 및 삽입되는 상태도 파악해야 합니다.
:
: 프로그램 실행중에 WM_DEVICECHANGE 메세지로 체크하면,
:
: WParam에는 DBT_DEVNODES_CHANGED (0x0007)만 들어오더라구요. (삽입이나 제거 둘다...)
:
: 모 어쨌든간에, 상태가 변경되었다는 것은 확인할 수 있었는데요,
:
: CreateFile을 하려면, 디바이스 패스명을 알아야 하는데요,
:
: (예를 들면, \\\\.\\USB#Vid_0547&Pid_1002#5&214b60b3&0&7#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 등과 같은거)
:
: 그걸 추출하는 방법을 모르겠습니다.
:
: 'USB완전정복' 이라는 책에는
:
: SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, &MyDeviceInterfaceData, DetailData, Length, &Length, NULL)
:
: 을 하면,
:
: DetailData->DevicePath 에 패스명이 들어온다구는 하는데,
:
: SetupDiGetDeviceInterfaceDetail 리턴이 true가 안되고,
:
: DetailData->DevicePath에는 이상한 문자만 있더라고요.
:
:
: 질문의 요지는 CreateFile을 하기 위해서 첫번째 인자인 디바이스패스명을 어떻게 추출하느냐는 겁니다.
:
: 다시한번 정리하자면, 폼생성시 현재 디바이스 상태를 점검하여 제가 필요한 USB 장치가 있는가를 확인 후,
:
: 디바이스 패스명을 알아내서 CreateFile하고, 프로그램 운용중에 새로운 장치가 삽입되거나 제거되면,
:
: 그상태에 따라 CreateFile을 할려는 것입니다.
:
: 이것때문에 며칠째 골머리를 앓고 있습니다.
:
: 제가 아직 접해보지 못한 부분이라 상세한 답변이나 예제 좀 부탁드리겠습니다.
:
: 즐건 하루되세요......

HDEVINFO hDevInfo = SetupDiGetClassDevs(...);

for(i=0 ; SetupDiEnumDeviceInfo(hDevInfo,i,) ;i++)
{
   //SetupDiGetDeviceRegistryProperty(hDevInfo,);
   //SP_DEVINFO_DATA :: ClassGuid
   for(j=0; SetupDiEnumDeviceInterfaces(hDevInfo,,,j,)  ;j++)
   {
      SetupDiGetDeviceInterfaceDetail(hDevInfo,);
   }
}

SetupDiDestroyDeviceInfoList(hDevInfo);

한편,
SP_DEVICE_INTERFACE_DETAIL_DATA::DevicePath에는 1바이트 밖에 잡혀있지 않습니다.
따라서, 아래와 같은 형식으로 해야 합니다.
DWORD DeviceInterfaceDetailDataSize = 0
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInterfaceDetailData = NULL;
while(!SetupDiGetDeviceInterfaceDetail(hDevInfo,,pDevInterfaceDetailData,DeviceInterfaceDetailDataSize ,&DeviceInterfaceDetailDataSize,)){
  DWORD errorno = GetLastError();
  if(errorno==ERROR_INSUFFICIENT_BUFFER){
   delete[] (char*)pDevInterfaceDetailData;
   pDevInterfaceDetailData  = (PSP_DEVICE_INTERFACE_DETAIL_DATA )new char[DeviceInterfaceDetailDataSize];
   pDevInterfaceDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  }else{
   //오류처리
   break;
  }
}
pDevInterfaceDetailData->DevicePath 사용;

사용후에는 delete[] (char*)pDevInterfaceDetailData;

+ -

관련 글 리스트
47779 [질문] USB 장치 제거 및 삽입 상태 파악할려는데요.. ㅜㅜ 나그네 1814 2007/01/17
47805     Re:[질문] USB 장치 제거 및 삽입 상태 파악할려는데요.. ㅜㅜ 3183 2007/01/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.