Recupero di un ID oggetto da un ID univoco persistente
Gli identificatori di oggetto sono garantiti solo per essere univoci per una determinata sessione del dispositivo; se l'utente stabilisce una nuova connessione, gli identificatori di una sessione precedente potrebbero non corrispondere agli identificatori per la sessione corrente. Per risolvere questo problema, l'API WPD supporta identificatori univoci persistenti (PUID), che vengono mantenuti nelle sessioni del dispositivo.
Alcuni dispositivi archiviano in modo nativo i relativi PUID con un determinato oggetto. Altri possono generare il PUID in base a un hash di dati dell'oggetto selezionato. Altri possono trattare gli identificatori di oggetto come PUID (perché possono garantire che questi identificatori non cambino mai).
La funzione GetObjectIdentifierFromPersistentUniqueIdentifier nel modulo ContentProperties.cpp illustra il recupero di un identificatore di oggetto per un determinato PUID.
L'applicazione può recuperare un identificatore di oggetto per un PUID corrispondente usando le interfacce descritte nella tabella seguente.
Interfaccia | Descrizione |
---|---|
Interfaccia IPortableDeviceContent | Fornisce l'accesso al metodo di recupero. |
Interfaccia IPortableDevicePropVariantCollection | Usato per archiviare sia l'identificatore dell'oggetto che l'identificatore univoco permanente corrispondente (PUID). |
La prima attività eseguita dall'applicazione di esempio consiste nel ottenere un PUID dall'utente.
// 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");
}
In seguito, l'applicazione di esempio recupera un oggetto IPortableDeviceContent , che userà per richiamare il metodo GetObjectIDsFromPersistentUniqueIDS .
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
Crea quindi un oggetto IPortableDevicePropVariantCollection che conterrà il PUID fornito dall'utente.
hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPersistentUniqueIDs));
Dopo aver eseguito i tre passaggi precedenti, l'esempio è pronto per recuperare l'identificatore dell'oggetto corrispondente al PUID fornito dall'utente. Questa operazione viene eseguita chiamando il metodo IPortableDeviceContent::GetObjectIDsFromPersistentUniqueIDs . Prima di chiamare questo metodo, l'esempio inizializza una struttura PROPVARIANT, scrive il PUID fornito dall'utente in questa struttura e lo aggiunge all'oggetto IPortableDevicePropVariantCollection in corrispondenza del quale pPersistentUniqueIDs punta. Questo puntatore viene passato come primo argomento al metodo GetObjectIDsFromPersistentUniqueIDs. Il secondo argomento di GetObjectIDsFromPersistentUniqueIDs è un oggetto IPortableDevicePropVariantCollection che riceve l'identificatore dell'oggetto corrispondente.
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);
}
}
Argomenti correlati