永続一意識別子の作成
ドライバーは、センサーごとに永続一意識別子 (PUID) を作成する必要があります。PUID は複数のセッションで格納される GUID 値であり、デバイス上のオブジェクトを一意に識別します。ドライバーは、SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID という名前のプロパティの照会時に、PUID 値を返す必要があります。デバイスに複数のセンサーが含まれている場合は、各センサーに独自の PUID を割り当てる必要があります。アプリケーションでこの ID を取得するには、Sensor API で ISensor::GetID メソッドを呼び出します。
可能な限り、既存の一意の ID を再利用することをお勧めします。一意の ID がまだ存在しない場合は、センサーが最初にコンピューターに接続したときに、センサーごとに PUID を 1 回作成し、この値を後で利用できるように保存します。
センサー クラス拡張が初期化される前、たとえば IPnpCallbackHardware::OnPrepareHardware での呼び出し時に、ドライバーは PUID を作成または取得する必要があります。このメソッドは、センサーを表す IWDFDevice インターフェイスへのポインターを提供します。このポインターを使用すると、各デバイスの個別のプロパティ ストアにアクセスできます。
次のコード例では、必要に応じて PUID を作成、保存、および取得する関数を作成します。
// Sets the persistent unique ID property in the WDF property store
// and returns the GUID for use in PortableDeviceValues property bags.
HRESULT CMyDevice::GetUniqueID(__in IWDFDevice* pWdfDevice,
__in LPCWSTR wszSensorID, __out GUID* puid)
{
HRESULT hr = S_OK;
// Smart pointer to the WDF property store.
// This pointer can store or retrieve the ID.
CComPtr<IWDFNamedPropertyStore> spPropStore;
if (SUCCEEDED(hr))
{
// Create the property store for this device or
// retrieve the existing one.
hr = pWdfDevice->RetrieveDevicePropertyStore(NULL, WdfPropertyStoreCreateIfMissing, &spPropStore, NULL);
}
if(SUCCEEDED(hr))
{
GUID idGuid;
PROPVARIANT vID;
// Try to get the PUID value previously stored as a string.
hr = spPropStore->GetNamedValue(wszSensorID, &vID);
if (SUCCEEDED(hr))
{
// Convert the PUID string to a GUID.
hr = ::CLSIDFromString(vID.bstrVal, &idGuid);
}
else
{
// There was no value in the store, so create a new value.
hr = ::CoCreateGuid(&idGuid);
if (SUCCEEDED(hr))
{
// Convert the GUID to a string.
LPOLESTR lpszGUID = NULL;
hr = ::StringFromCLSID(idGuid, &lpszGUID);
if (SUCCEEDED(hr))
{
// Put the new value into the property store.
PropVariantInit(&vID);
vID.vt = VT_LPWSTR;
vID.pwszVal = lpszGUID;
hr = spPropStore->SetNamedValue(wszSensorID, &vID);
PropVariantClear(&vID);
}
}
}
// Return the PUID GUID.
*puid = idGuid;
}
return hr;
}