WPD(디바이스 열거)
대부분의 애플리케이션에서 완료한 첫 번째 작업은 컴퓨터에 연결된 디바이스의 열거형입니다. 이 작업 및 디바이스 정보(예: 제조업체, 식별 이름 및 설명)의 검색은 IPortableDeviceManager 인터페이스에서 지원됩니다.
DeviceEnumeration.cpp 모듈의 EnumerateAllDevices 함수에는 연결된 디바이스 수의 검색을 보여 주는 코드와 개수가 검색되면 연결된 각 디바이스에 대한 디바이스별 정보 검색을 보여 주는 코드가 포함되어 있습니다.
EnumerateAllDevices 함수는 네 가지 기본 작업을 수행합니다.
- 이식 가능한 디바이스 관리자 개체를 만듭니다.
- 연결된 디바이스 수를 검색합니다.
- 연결된 디바이스에 대한 디바이스 정보를 검색합니다.
- 디바이스 정보를 검색할 때 사용되는 메모리를 해제합니다.
이러한 네 가지 작업은 각각 다음 섹션에서 자세히 설명합니다.
디바이스 열거 프로세스의 첫 번째 단계는 이식 가능한 디바이스 관리자 개체를 만드는 것입니다. 이 작업은 CoCreateInstance 함수를 호출하고 개체에 대한 CLSID(클래스 식별자)를 전달하고, 코드가 실행될 컨텍스트를 지정하고, IPortableDeviceManager 인터페이스에 대한 참조 식별자를 지정한 다음, IPortableDeviceManager 인터페이스 포인터를 수신하는 포인터 변수를 제공하여 수행됩니다.
HRESULT hr = CoCreateInstance(CLSID_PortableDeviceManager,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPortableDeviceManager));
if (FAILED(hr))
{
printf("! Failed to CoCreateInstance CLSID_PortableDeviceManager, hr = 0x%lx\n",hr);
}
IPortableDeviceManager 인터페이스 포인터를 가져오면 이 인터페이스에서 메서드 호출을 시작할 수 있습니다. EnumerateAllDevices 함수에서 호출된 첫 번째 메서드는 IPortableDeviceManager::GetDevices입니다. 첫 번째 인수를 NULL로 설정하여 이 메서드를 호출하면 연결된 디바이스 수가 반환됩니다.
if (SUCCEEDED(hr))
{
hr = pPortableDeviceManager->GetDevices(NULL, &cPnPDeviceIDs);
if (FAILED(hr))
{
printf("! Failed to get number of devices on the system, hr = 0x%lx\n",hr);
}
}
// Report the number of devices found. NOTE: we will report 0, if an error
// occured.
printf("\n%d Windows Portable Device(s) found on the system\n\n", cPnPDeviceIDs);
연결된 디바이스 수를 검색한 후에는 이 값을 사용하여 연결된 각 디바이스에 대한 디바이스 정보를 검색할 수 있습니다. 이 프로세스는 문자열 포인터 배열을 첫 번째 인수로 전달하고 이 배열이 두 번째 인수로 보유할 수 있는 요소 수(이 개수는 사용 가능한 디바이스 수와 같아야 합니다)로 전달하여 시작합니다.
이 메서드에서 반환되는 문자열은 연결된 디바이스의 플러그 앤 플레이 이름입니다. 이러한 이름은 IPortableDeviceManager 인터페이스의 다른 메서드로 전달되어 식별 이름, 제조업체 이름 및 디바이스 설명과 같은 디바이스 관련 정보를 검색합니다. (이러한 이름은 애플리케이션이 IPortableDevice::Open 메서드를 호출할 때 디바이스에 대한 연결을 여는 데도 사용됩니다.)
if (SUCCEEDED(hr) && (cPnPDeviceIDs > 0))
{
pPnpDeviceIDs = new (std::nothrow) PWSTR[cPnPDeviceIDs];
if (pPnpDeviceIDs != NULL)
{
DWORD dwIndex = 0;
hr = pPortableDeviceManager->GetDevices(pPnpDeviceIDs, &cPnPDeviceIDs);
if (SUCCEEDED(hr))
{
// For each device found, display the devices friendly name,
// manufacturer, and description strings.
for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
printf("[%d] ", dwIndex);
DisplayFriendlyName(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
printf(" ");
DisplayManufacturer(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
printf(" ");
DisplayDescription(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
}
}
else
{
printf("! Failed to get the device list from the system, hr = 0x%lx\n",hr);
}
디바이스 정보를 검색한 후에는 문자열 포인터 배열에서 가리키는 문자열과 연결된 메모리를 해제해야 합니다. 또한 이 배열을 삭제해야 합니다.
for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
CoTaskMemFree(pPnpDeviceIDs[dwIndex]);
pPnpDeviceIDs[dwIndex] = NULL;
}
// Delete the array of PWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;
관련 항목