Abrufen einer Objekt-ID aus einer persistenten eindeutigen ID
Objektbezeichner sind nur für eine bestimmte Gerätesitzung eindeutig. Wenn der Benutzer eine neue Verbindung herstellt, stimmen Bezeichner aus einer vorherigen Sitzung möglicherweise nicht mit den Bezeichnern für die aktuelle Sitzung überein. Um dieses Problem zu beheben, unterstützt die WPD-API persistente eindeutige Bezeichner (PUIDs), die über Gerätesitzungen hinweg beibehalten werden.
Einige Geräte speichern ihre PUIDs nativ mit einem bestimmten Objekt. Andere können die PUID basierend auf einem Hash der ausgewählten Objektdaten generieren. Andere können Objektbezeichner als PUIDs behandeln (da sie garantieren können, dass sich diese Bezeichner nie ändern).
Die GetObjectIdentifierFromPersistentUniqueIdentifier-Funktion im Modul ContentProperties.cpp veranschaulicht den Abruf eines Objektbezeichners für eine bestimmte PUID.
Ihre Anwendung kann mithilfe der in der folgenden Tabelle beschriebenen Schnittstellen einen Objektbezeichner für eine entsprechende PUID abrufen.
Schnittstelle | BESCHREIBUNG |
---|---|
IPortableDeviceContent-Schnittstelle | Bietet Zugriff auf die Abrufmethode. |
IPortableDevicePropVariantCollection-Schnittstelle | Wird verwendet, um sowohl den Objektbezeichner als auch den entsprechenden persistenten eindeutigen Bezeichner (PUID) zu speichern. |
Die erste Aufgabe, die die Beispielanwendung erfüllt, besteht darin, eine PUID vom Benutzer abzurufen.
// 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");
}
Danach ruft die Beispielanwendung ein IPortableDeviceContent-Objekt ab, das zum Aufrufen der GetObjectIDsFromPersistentUniqueIDs-Methode verwendet wird.
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
Als Nächstes wird ein IPortableDevicePropVariantCollection-Objekt erstellt, das die vom Benutzer bereitgestellte PUID enthält.
hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPersistentUniqueIDs));
Nachdem die vorherigen drei Schritte ausgeführt wurden, kann das Beispiel den Objektbezeichner abrufen, der der vom Benutzer bereitgestellten PUID entspricht. Dies wird durch Aufrufen der IPortableDeviceContent::GetObjectIDsFromPersistentUniqueIDs-Methode erreicht. Vor dem Aufrufen dieser Methode initialisiert das Beispiel eine PROPVARIANT-Struktur, schreibt die vom Benutzer bereitgestellte PUID in diese Struktur und fügt sie dem IPortableDevicePropVariantCollection-Objekt hinzu, auf das pPersistentUniqueIDs verweist. Dieser Zeiger wird als erstes Argument an die GetObjectIDsFromPersistentUniqueIDs-Methode übergeben. Das zweite Argument von GetObjectIDsFromPersistentUniqueIDs ist ein IPortableDevicePropVariantCollection-Objekt, das den übereinstimmenden Objektbezeichner empfängt.
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);
}
}
Zugehörige Themen