Schreiben von Objekteigenschaften

Dienste enthalten häufig untergeordnete Objekte, die zu einem der Formate gehören, die von jedem Dienst unterstützt werden. Beispielsweise kann ein Kontaktdienst mehrere Kontaktobjekte im Format "Abstrakter Kontakt" unterstützen. Jedes Kontaktobjekt wird durch verwandte Eigenschaften (Kontaktname, Telefonnummer, E-Mail-Adresse usw.) beschrieben.

Die WpdServicesApiSample-Anwendung enthält Code, der veranschaulicht, wie eine Anwendung die Name-Eigenschaft für ein untergeordnetes Objekt des angegebenen Contacts-Diensts aktualisieren kann. In diesem Beispiel werden die folgenden WPD-Schnittstellen verwendet.

Schnittstelle Beschreibung
IPortableDeviceService Wird verwendet, um die IPortableDeviceContent2-Schnittstelle für den Zugriff auf die unterstützten Dienstmethoden abzurufen.
IPortableDeviceContent2 Bietet Zugriff auf die inhaltsspezifischen Methoden.
IPortableDeviceProperties Wird verwendet, um die Objekteigenschaftswerte zu schreiben und zu bestimmen, ob eine bestimmte Eigenschaft geschrieben werden kann
IPortableDeviceValues Dient zum Speichern der zu schreibenden Eigenschaftswerte, zum Bestimmen der Ergebnisse des Schreibvorgangs und zum Abrufen von Attributen von Eigenschaften (beim Bestimmen der Schreibfunktion).

 

Wenn der Benutzer die Option "8" in der Befehlszeile wählt, ruft die Anwendung die WriteContentProperties-Methode auf, die sich im Modul ContentProperties.cpp befindet. Diese Methode fordert den Benutzer auf, einen Objektbezeichner für die zu aktualisierende Eigenschaft einzugeben. Der Benutzer identifiziert das Objekt, und die -Methode fordert den Benutzer auf, einen neuen Namen anzugeben. Nachdem dieser Name angegeben wurde, aktualisiert die Methode die Name-Eigenschaft für das angegebene Objekt.

Beachten Sie, dass die Beispielanwendung vor dem Schreiben der Objekteigenschaften einen Kontaktdienst auf einem verbundenen Gerät öffnet.

Der folgende Code für die WriteContentProperties-Methode veranschaulicht, wie die Anwendung die IPortableDeviceContent2-Schnittstelle verwendet, um eine IPortableDeviceProperties-Schnittstelle abzurufen. Durch Übergeben der PROPERTYKEYS der angeforderten Eigenschaften an die IPortableDeviceProperties::SetValues-Methode aktualisiert WriteContentProperties die name-Eigenschaft.

void WriteContentProperties(
 IPortableDeviceService* pService)
{
 if (pService == NULL)
 {
  printf("! A NULL IPortableDeviceService interface pointer was received\n");
  return;
 }

 HRESULT          hr       = S_OK;
 WCHAR         wszSelection[81]  = {0};
 WCHAR         wszNewObjectName[81] = {0};
 CComPtr<IPortableDeviceProperties> pProperties;
 CComPtr<IPortableDeviceContent2>   pContent;
 CComPtr<IPortableDeviceValues>  pObjectPropertiesToWrite;
 CComPtr<IPortableDeviceValues>  pPropertyWriteResults;
 CComPtr<IPortableDeviceValues>  pAttributes;
 BOOL          bCanWrite   = FALSE;

 // Prompt user to enter an object identifier on the device to write properties on.
 printf("Enter the identifer of the object you wish to write properties on.\n>");
 hr = StringCbGetsW(wszSelection,sizeof(wszSelection));
 if (FAILED(hr))
 {
  printf("An invalid object identifier was specified, aborting property reading\n");
 }

 // 1) Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to
 // access the content-specific methods.
 if (SUCCEEDED(hr))
 {
  hr = pService->Content(&pContent);
  if (FAILED(hr))
  {
   printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr);
  }
 }

 // 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent2 interface
 // to access the property-specific methods.
 if (SUCCEEDED(hr))
 {
  hr = pContent->Properties(&pProperties);
  if (FAILED(hr))
  {
   printf("! Failed to get IPortableDeviceProperties from IPortableDeviceContent2, hr = 0x%lx\n",hr);
  }
 }

 // 3) Check the property attributes to see if we can write/change the NAME_GenericObj_Name property.
 if (SUCCEEDED(hr))
 {
  hr = pProperties->GetPropertyAttributes(wszSelection,
            PKEY_GenericObj_Name,
            &pAttributes);
  if (SUCCEEDED(hr))
  {
   hr = pAttributes->GetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, &bCanWrite);
   if (SUCCEEDED(hr))
   {
    if (bCanWrite)
    {
     printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for PKEY_GenericObj_Name reports TRUE\nThis means that the property can be changed/updated\n\n");
    }
    else
    {
     printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for PKEY_GenericObj_Name reports FALSE\nThis means that the property cannot be changed/updated\n\n");
    }
   }
   else
   {
    printf("! Failed to get the WPD_PROPERTY_ATTRIBUTE_CAN_WRITE value for PKEY_GenericObj_Name on object '%ws', hr = 0x%lx\n", wszSelection, hr);
   }
  }
 }

 // 4) Prompt the user for the new value of the NAME_GenericObj_Name property only if the property attributes report
 // that it can be changed/updated.
 if (bCanWrite)
 {
  printf("Enter the new PKEY_GenericObj_Name property for the object '%ws'.\n>",wszSelection);
  hr = StringCbGetsW(wszNewObjectName,sizeof(wszNewObjectName));
  if (FAILED(hr))
  {
   printf("An invalid PKEY_GenericObj_Name was specified, aborting property writing\n");
  }

  // 5) CoCreate an IPortableDeviceValues interface to hold the property values
  // we wish to write.
  if (SUCCEEDED(hr))
  {
   hr = CoCreateInstance(CLSID_PortableDeviceValues,
          NULL,
          CLSCTX_INPROC_SERVER,
          IID_IPortableDeviceValues,
          (VOID**) &pObjectPropertiesToWrite);
   if (SUCCEEDED(hr))
   {
    if (pObjectPropertiesToWrite != NULL)
    {
     hr = pObjectPropertiesToWrite->SetStringValue(PKEY_GenericObj_Name, wszNewObjectName);
     if (FAILED(hr))
     {
      printf("! Failed to add PKEY_GenericObj_Name to IPortableDeviceValues, hr= 0x%lx\n", hr);
     }
    }
   }
  }

  // 6) Call SetValues() passing the collection of specified PROPERTYKEYs.
  if (SUCCEEDED(hr))
  {
   hr = pProperties->SetValues(wszSelection,      // The object whose properties we are reading
          pObjectPropertiesToWrite,   // The properties we want to read
          &pPropertyWriteResults); // Driver supplied property result values for the property read operation
   if (FAILED(hr))
   {
    printf("! Failed to set properties for object '%ws', hr= 0x%lx\n", wszSelection, hr);
   }
   else
   {
    printf("The PKEY_GenericObj_Name property on object '%ws' was written successfully (Read the properties again to see the updated value)\n", wszSelection);
   }
  }
 }
}

IPortableDeviceContent2

IPortableDeviceProperties

WpdServicesApiSample