次の方法で共有


永続一意識別子の作成

ドライバーは、センサーごとに永続一意識別子 (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;
}