다음을 통해 공유


WPD(디바이스 열거)

대부분의 애플리케이션에서 완료한 첫 번째 작업은 컴퓨터에 연결된 디바이스의 열거형입니다. 이 작업 및 디바이스 정보(예: 제조업체, 식별 이름 및 설명)의 검색은 IPortableDeviceManager 인터페이스에서 지원됩니다.

DeviceEnumeration.cpp 모듈의 EnumerateAllDevices 함수에는 연결된 디바이스 수의 검색을 보여 주는 코드와 개수가 검색되면 연결된 각 디바이스에 대한 디바이스별 정보 검색을 보여 주는 코드가 포함되어 있습니다.

EnumerateAllDevices 함수는 네 가지 기본 작업을 수행합니다.

  1. 이식 가능한 디바이스 관리자 개체를 만듭니다.
  2. 연결된 디바이스 수를 검색합니다.
  3. 연결된 디바이스에 대한 디바이스 정보를 검색합니다.
  4. 디바이스 정보를 검색할 때 사용되는 메모리를 해제합니다.

이러한 네 가지 작업은 각각 다음 섹션에서 자세히 설명합니다.

디바이스 열거 프로세스의 첫 번째 단계는 이식 가능한 디바이스 관리자 개체를 만드는 것입니다. 이 작업은 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;

IPortableDeviceManager 인터페이스

프로그래밍 가이드