단일 개체에 대한 속성 설정
애플리케이션이 지정된 개체에 대한 개체 식별자( 콘텐츠 열거 항목 참조)를 검색한 후 다음 표에 설명된 인터페이스에서 메서드를 호출하여 해당 개체에 대한 속성을 설정할 수 있습니다.
인터페이스 | Description |
---|---|
IPortableDeviceProperties 인터페이스 | 지정된 속성을 쓸 수 있는지 여부를 확인하고 쓰기 작업을 보내는 데 사용됩니다. |
IPortableDeviceContent 인터페이스 | 콘텐츠별 메서드에 대한 액세스를 제공합니다. |
IPortableDeviceValues 인터페이스 | 작성할 값을 보관하고, 쓰기 작업의 결과를 확인하고, 속성의 특성을 검색하는 데 사용됩니다(쓰기 기능을 결정할 때). |
애플리케이션은 먼저 IPortableDeviceValues 인터페이스를 사용하여 새 값을 지정하는 속성 모음을 만들어 개체의 속성을 설정합니다. 속성 모음이 만들어지면 애플리케이션은 IPortableDeviceProperties::SetValues 메서드를 호출하여 해당 속성을 설정합니다.
샘플 애플리케이션의 ContentProperties.cpp 모듈의 함수는 WriteContentProperties
애플리케이션이 선택한 개체에 대해 새 개체 이름 속성을 설정하는 방법을 보여 줍니다.
함수에서 WriteContentProperties
수행하는 첫 번째 작업은 애플리케이션이 새 이름을 쓸 개체의 개체 식별자를 입력하라는 메시지를 사용자에게 표시하는 것입니다.
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
WCHAR szNewObjectName[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceContent> 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(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting property reading\n");
}
그런 다음 애플리케이션은 WPD_OBJECT_NAME 속성에 대한 WPD_PROPERTY_ATTRIBUTE_CAN_WRITE 값을 검색하여 속성을 쓸 수 있는지 여부를 결정합니다. (애플리케이션은 WPD_PROPERTY_ATTRIBUTE_CAN_WRITE 값이 true인 속성을 설정할 수 있습니다.)
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent interface
// to access the property-specific methods.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceProperties from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 3) Check the property attributes to see if we can write/change the WPD_OBJECT_NAME property.
if (SUCCEEDED(hr))
{
hr = pProperties->GetPropertyAttributes(szSelection,
WPD_OBJECT_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 the WPD_OBJECT_NAME reports TRUE\nThis means that the property can be changed/updated\n\n");
}
else
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for the WPD_OBJECT_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 from WPD_OBJECT_NAME on object '%ws', hr = 0x%lx\n",szSelection, hr);
}
}
}
다음 단계는 사용자에게 새 이름 문자열을 묻는 메시지를 표시하는 것입니다. ( IPortableDeviceValues::SetStringValue 메서드에 대한 호출은 속성 모음만 만듭니다. 실제 속성은 아직 작성되지 않았습니다.)
if (bCanWrite)
{
printf("Enter the new WPD_OBJECT_NAME for the object '%ws'.\n>",szSelection);
hr = StringCbGetsW(szNewObjectName,sizeof(szNewObjectName));
if (FAILED(hr))
{
printf("An invalid object 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_PPV_ARGS(&pObjectPropertiesToWrite));
if (SUCCEEDED(hr))
{
if (pObjectPropertiesToWrite != NULL)
{
hr = pObjectPropertiesToWrite->SetStringValue(WPD_OBJECT_NAME, szNewObjectName);
if (FAILED(hr))
{
printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceValues, hr= 0x%lx\n", hr);
}
}
}
}
마지막으로 사용자가 지정한 새 값이 개체에 적용됩니다.
if (SUCCEEDED(hr))
{
hr = pProperties->SetValues(szSelection, // 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", szSelection, hr);
}
else
{
printf("The WPD_OBJECT_NAME property on object '%ws' was written successfully (Read the properties again to see the updated value)\n", szSelection);
}
}
관련 항목