|
나그네 님이 쓰신 글 :
: 안녕하세요..
:
: 항상 좋은 정보를 얻어가고 있습니다.
:
: 다름이 아니라,
:
: 이번에 여러개의 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;
|