共用方式為


從永續性唯一識別碼擷取物件識別碼

物件識別碼只保證為指定裝置會話的唯一識別碼;如果使用者建立新的連線,則來自上一個會話的識別碼可能不符合目前會話的識別碼。 若要解決此問題,WPD API 支援持續的唯一識別碼 (PUID) ,這些識別碼會跨裝置會話保存。

有些裝置會以原生方式使用指定的 物件來儲存其 PUID。 其他人可能會根據所選物件資料的雜湊來產生 PUID。 其他人可能會將物件識別碼視為 PUID (,因為它們可以保證這些識別碼永遠不會變更) 。

ContentProperties.cpp 模組中的 GetObjectIdentifierFromPersistentUniqueIdentifier 函式示範如何擷取指定 PUID 的物件識別碼。

您的應用程式可以使用下表所述的介面,擷取對應 PUID 的物件識別碼。

介面 描述
IPortableDeviceContent 介面 提供擷取方法的存取權。
IPortableDevicePropVariantCollection 介面 用來儲存物件識別碼和對應的永續性唯一識別碼, (PUID) 。

 

範例應用程式完成的第一項工作是從使用者取得 PUID。

// Prompt user to enter an unique identifier to convert to an object idenifier.
printf("Enter the Persistant Unique Identifier of the object you wish to convert into an object identifier.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
    printf("An invalid persistent object identifier was specified, aborting the query operation\n");
}

在此之後,範例應用程式會擷取 IPortableDeviceContent 物件,它會用來叫用 GetObjectIDsFromPersistentUniqueIDs 方法。

if (SUCCEEDED(hr))
{
    hr = pDevice->Content(&pContent);
    if (FAILED(hr))
    {
        printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
    }
}

接下來,它會建立 IPortableDevicePropVariantCollection 物件,以保存使用者所提供的 PUID。

hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&pPersistentUniqueIDs));

一旦採取前三個步驟,範例即可擷取符合使用者所提供 PUID 的物件識別碼。 呼叫 IPortableDeviceContent::GetObjectIDsFromPersistentUniqueIDs 方法即可達成此目的。 在呼叫這個方法之前,此範例會初始化 PROPVARIANT 結構、將使用者提供的 PUID 寫入此結構,並將它新增至 pPersistentUniqueIDs 指向的 IPortableDevicePropVariantCollection 物件。 這個指標會當做 GetObjectIDsFromPersistentUniqueIDs 方法的第一個引數傳遞。 GetObjectIDsFromPersistentUniqueIDs 的第二個引數是接收相符物件識別碼的 IPortableDevicePropVariantCollection 物件。

if (SUCCEEDED(hr))
{
    if (pPersistentUniqueIDs != NULL)
    {
        PROPVARIANT pv = {0};
        PropVariantInit(&pv);

        // Initialize a PROPVARIANT structure with the object identifier string
        // that the user selected above. Notice we are allocating memory for the
        // PWSTR value.  This memory will be freed when PropVariantClear() is
        // called below.
        pv.vt      = VT_LPWSTR;
        pv.pwszVal = AtlAllocTaskWideString(szSelection);
        if (pv.pwszVal != NULL)
        {
            // Add the object identifier to the objects-to-delete list
            // (We are only deleting 1 in this example)
            hr = pPersistentUniqueIDs->Add(&pv);
            if (SUCCEEDED(hr))
            {
                // 3) Attempt to get the unique idenifier for the object from the device
                hr = pContent->GetObjectIDsFromPersistentUniqueIDs(pPersistentUniqueIDs,
                                                                   &pObjectIDs);
                if (SUCCEEDED(hr))
                {
                    PROPVARIANT pvId = {0};
                    hr = pObjectIDs->GetAt(0, &pvId);
                    if (SUCCEEDED(hr))
                    {
                        printf("The persistent unique identifier '%ws' relates to object identifier '%ws' on the device.\n", szSelection, pvId.pwszVal);
                    }
                    else
                    {
                        printf("! Failed to get the object identifier for '%ws' from the IPortableDevicePropVariantCollection, hr = 0x%lx\n",szSelection, hr);
                    }

                    // Free the returned allocated string from the GetAt() call
                    PropVariantClear(&pvId);
                }
                else
                {
                    printf("! Failed to get the object identifier from persistent object idenifier '%ws', hr = 0x%lx\n",szSelection, hr);
                }
            }
            else
            {
                printf("! Failed to get the object identifier from persistent object idenifier because we could no add the persistent object identifier string to the IPortableDevicePropVariantCollection, hr = 0x%lx\n",hr);
            }
        }
        else
        {
            hr = E_OUTOFMEMORY;
            printf("! Failed to get the object identifier because we could no allocate memory for the persistent object identifier string, hr = 0x%lx\n",hr);
        }

        // Free any allocated values in the PROPVARIANT before exiting
        PropVariantClear(&pv);
    }
}

IPortableDevice 介面

IPortableDeviceContent 介面

IPortableDevicePropVariantCollection 介面

程式設計指南