다음을 통해 공유


서비스 콘텐츠 열거

애플리케이션이 서비스를 열면 서비스 관련 작업을 시작할 수 있습니다. WpdServicesApiSample 애플리케이션의 경우 이러한 작업 중 하나는 지정된 연락처 서비스에 대한 콘텐츠의 열거형입니다. 다음 표에서는 사용되는 인터페이스에 대해 설명합니다.

인터페이스 Description
IPortableDeviceService 서비스의 콘텐츠에 액세스하기 위해 IPortableDeviceContent2 인터페이스를 검색하는 데 사용됩니다.
IPortableDeviceContent2 서비스의 개체를 열거하기 위해 IEnumPortableDeviceObjectIDs 인터페이스를 검색하는 데 사용됩니다.
IEnumPortableDeviceObjectIDs 서비스의 개체를 열거하는 데 사용됩니다.

 

콘텐츠 열거 코드는 ContentEnumeration.cpp 모듈에 있습니다. 이 코드는 EnumerateAllContentRecursiveEnumerate 메서드에 상주합니다. 이전 메서드는 후자를 호출합니다.

EnumerateContent 메서드는 IPortableDeviceService 개체에 대한 포인터를 하나의 매개 변수로 사용합니다. 이 개체는 애플리케이션이 IPortableDeviceService::Open 메서드를 호출할 때 이전에 연 서비스에 해당합니다.

EnumerateContent 메서드는 IPortableDeviceContent2 개체를 만들고 이 개체를 IPortableDeviceService::Content 메서드에 전달합니다. 이 메서드는 서비스의 루트 수준에서 콘텐츠를 검색한 다음, 루트 아래에 있는 콘텐츠를 재귀적으로 검색하기 시작합니다.

다음 코드는 EnumerateContent 메서드에 해당합니다.

// Enumerate all content on the service starting with the
// "DEVICE" object
void EnumerateAllContent(
    IPortableDeviceService* pService)
{
    HRESULT                          hr = S_OK;
    CComPtr<IPortableDeviceContent2> pContent;

    if (pService == NULL)
    {
        printf("! A NULL IPortableDeviceService interface pointer was received\n");
        return;
    }

    // Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to
    // access the content-specific methods.
    hr = pService->Content(&pContent);
    if (FAILED(hr))
    {
        printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr);
    }

    // Enumerate content starting from the "DEVICE" object.
    if (SUCCEEDED(hr))
    {
        printf("\n");
        RecursiveEnumerate(WPD_DEVICE_OBJECT_ID, pContent);
    }
}

다음 코드는 RecursiveEnumerate 메서드에 해당합니다. RecursiveEnumerate 메서드는 제공된 부모 개체에 대한 IEnumPortableDeviceObjectIDs 인터페이스를 인스턴스화하고 IEnumPortableDeviceObjectIDs::Next를 호출하여 직계 자식 개체의 일괄 처리를 검색합니다. 각 자식 개체에 대해 RecursiveEnumerate를 다시 호출하여 하위 자식 개체를 반환하는 등의 작업을 수행합니다.

// Recursively called function which enumerates using the specified
// object identifier as the parent.
void RecursiveEnumerate(
    PCWSTR                   pszObjectID,
    IPortableDeviceContent2* pContent)
{
    CComPtr<IEnumPortableDeviceObjectIDs> pEnumObjectIDs;

    // Print the object identifier being used as the parent during enumeration.
    printf("%ws\n",pszObjectID);

    // Get an IEnumPortableDeviceObjectIDs interface by calling EnumObjects with the
    // specified parent object identifier.
    HRESULT hr = pContent->EnumObjects(0,               // Flags are unused
                                       pszObjectID,     // Starting from the passed in object
                                       NULL,            // Filter is unused
                                       &pEnumObjectIDs);
    if (FAILED(hr))
    {
        printf("! Failed to get IEnumPortableDeviceObjectIDs from IPortableDeviceContent2, hr = 0x%lx\n",hr);
    }

    // Loop calling Next() while S_OK is being returned.
    while(hr == S_OK)
    {
        DWORD  cFetched = 0;
        PWSTR  szObjectIDArray[NUM_OBJECTS_TO_REQUEST] = {0};
        hr = pEnumObjectIDs->Next(NUM_OBJECTS_TO_REQUEST,   // Number of objects to request on each NEXT call
                                  szObjectIDArray,          // Array of PWSTR array which will be populated on each NEXT call
                                  &cFetched);               // Number of objects written to the PWSTR array
        if (SUCCEEDED(hr))
        {
            // Traverse the results of the Next() operation and recursively enumerate
            // Remember to free all returned object identifiers using CoTaskMemFree()
            for (DWORD dwIndex = 0; dwIndex < cFetched; dwIndex++)
            {
                RecursiveEnumerate(szObjectIDArray[dwIndex],pContent);

                // Free allocated PWSTRs after the recursive enumeration call has completed.
                CoTaskMemFree(szObjectIDArray[dwIndex]);
                szObjectIDArray[dwIndex] = NULL;
            }
        }
    }
}

IEnumPortableDeviceObjectIDs

IPortableDeviceContent2 인터페이스

IPortableDeviceService 인터페이스

서비스 열기

WpdServicesApiSample