센서 속성 검색 및 설정
이 항목에서는 센서 속성에 대한 값을 검색하고 설정하는 방법을 설명합니다. ISensor 인터페이스는 센서 속성에 대한 값을 설정하고 검색하는 메서드를 제공합니다.
센서 속성 검색
사용자가 사용하도록 설정하기 전에 센서에서 일부 속성 값을 검색할 수 있습니다. 제조업체의 이름 또는 센서 모델과 같은 정보는 프로그램에서 센서를 사용할 수 있는지 여부를 결정하는 데 도움이 될 수 있습니다.
단일 속성 값을 검색하거나 속성 값 컬렉션을 함께 검색하도록 선택할 수 있습니다. 단일 값을 검색하려면 ISensor::GetProperty를 호출합니다. 값 컬렉션을 검색하려면 ISensor::GetProperties를 호출합니다. 첫 번째 매개 변수를 통해 NULL 을 ISensor::GetProperties에 전달하여 센서의 모든 속성을 검색할 수 있습니다.
다음 예제 코드는 단일 속성의 값을 인쇄하는 도우미 함수를 만듭니다. 함수는 값을 검색할 센서에 대한 포인터와 인쇄할 속성이 포함된 속성 키를 받습니다. 함수는 숫자, 문자열 및 GUID의 값을 인쇄할 수 있지만 다른 더 복잡한 형식은 인쇄할 수 없습니다.
HRESULT PrintSensorProperty(ISensor* pSensor, REFPROPERTYKEY pk)
{
assert(pSensor);
HRESULT hr = S_OK;
PROPVARIANT pv = {};
hr = pSensor->GetProperty(pk, &pv);
if(SUCCEEDED(hr))
{
if(pv.vt == VT_UI4) // Number
{
wprintf_s(L"\nSensor integer value: %u\n", pv.ulVal);
}
else if(pv.vt == VT_LPWSTR) // String
{
wprintf_s(L"\nSensor string value: %s\n", pv.pwszVal);
}
else if(pv.vt == VT_CLSID) // GUID
{
int iRet = 0;
// Convert the GUID to a string.
OLECHAR wszGuid[39] = {}; // Buffer for string.
iRet = ::StringFromGUID2(*(pv.puuid), wszGuid, 39);
assert(39 == iRet); // Count of characters returned for GUID.
wprintf_s(L"\nSensor GUID value: %s\n", wszGuid);
}
else // Interface or vector
{
wprintf_s(L"\nSensor property is a compound type. Unable to print value.");
}
}
PropVariantClear(&pv);
return hr;
}
다음 예제 코드는 속성 컬렉션을 검색하고 인쇄하는 함수를 만듭니다. 인쇄할 속성 집합은 SensorProperties라는 배열에 의해 정의됩니다.
HRESULT PrintSensorProperties(ISensor* pSensor)
{
assert(pSensor);
HRESULT hr = S_OK;
DWORD cVals = 0; // Count of returned properties.
IPortableDeviceKeyCollection* pKeys = NULL; // Input
IPortableDeviceValues* pValues = NULL; // Output
// Properties to print.
const PROPERTYKEY SensorProperties[] =
{
SENSOR_PROPERTY_MANUFACTURER,
SENSOR_PROPERTY_SERIAL_NUMBER,
SENSOR_PROPERTY_DESCRIPTION,
SENSOR_PROPERTY_FRIENDLY_NAME
};
// CoCreate a key collection to store property keys.
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pKeys));
if(SUCCEEDED(hr))
{
// Add the properties to the key collection.
for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(SensorProperties); dwIndex++)
{
hr = pKeys->Add(SensorProperties[dwIndex]);
if(FAILED(hr))
{
// Unexpected.
// This example returns the failed HRESULT.
// You may choose to ignore failures, here.
break;
}
}
}
if(SUCCEEDED(hr))
{
// Retrieve the properties from the sensor.
hr = pSensor->GetProperties(pKeys, &pValues);
}
if(SUCCEEDED(hr))
{
// Get the number of values returned.
hr = pValues->GetCount(&cVals);
}
if(SUCCEEDED(hr))
{
PROPERTYKEY pk; // Keys
PROPVARIANT pv = {}; // Values
// Loop through the values;
for (DWORD i = 0; i < cVals; i++)
{
// Get the value at the current index.
hr = pValues->GetAt(i, &pk, &pv);
if(SUCCEEDED(hr))
{
// Find and print the property.
if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_MANUFACTURER))
{
wprintf_s(L"\nManufacturer: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_SERIAL_NUMBER))
{
wprintf_s(L"Serial number: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_FRIENDLY_NAME))
{
wprintf_s(L"Friendly name: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_DESCRIPTION))
{
wprintf_s(L"Description: %s\n", pv.pwszVal);
}
}
PropVariantClear(&pv);
} // end i loop
}
SafeRelease(&pKeys);
SafeRelease(&pValues);
return hr;
};
센서 속성 설정
센서에 대한 속성 값을 설정하려면 먼저 사용자가 센서를 사용하도록 설정해야 합니다. 또한 모든 센서 속성을 설정할 수 있는 것은 아닙니다.
속성에 대해 하나 이상의 값을 설정하려면 ISensor::SetProperties를 호출합니다. 설정할 속성의 컬렉션과 연결된 값이 포함된 IPortableDeviceValues 포인터를 사용하여 이 메서드를 제공합니다. 메서드는 설정할 수 없는 속성에 대한 오류 코드를 포함할 수 있는 해당 IPortableDeviceValues 인터페이스를 반환합니다.
다음 예제 코드는 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL 속성에 대한 새 값을 설정하는 도우미 함수를 만듭니다. 함수는 속성을 설정할 센서에 대한 포인터와 설정할 새 보고서 간격을 나타내는 ULONG 값을 사용합니다. (이 특정 속성에 대한 값을 설정해도 센서가 지정된 값을 수락한다고 보장할 수 없습니다. 이 속성 의 작동 방식에 대한 자세한 내용은 센서 속성을 참조하세요.)
HRESULT SetCurrentReportInterval(ISensor* pSensor, ULONG ulNewInterval)
{
assert(pSensor);
HRESULT hr = S_OK;
IPortableDeviceValues* pPropsToSet = NULL; // Input
IPortableDeviceValues* pPropsReturn = NULL; // Output
// Create the input object.
hr = CoCreateInstance(__uuidof(PortableDeviceValues),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPropsToSet));
if(SUCCEEDED(hr))
{
// Add the current report interval property.
hr = pPropsToSet->SetUnsignedIntegerValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, ulNewInterval);
}
if(SUCCEEDED(hr))
{
// Only setting a single property, here.
hr = pSensor->SetProperties(pPropsToSet, &pPropsReturn);
}
// Test for failure.
if(hr == S_FALSE)
{
HRESULT hrError = S_OK;
// Check results for failure.
hr = pPropsReturn->GetErrorValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, &hrError);
if(SUCCEEDED(hr))
{
// Print an error message.
wprintf_s(L"\nSetting current report interval failed with error 0x%X\n", hrError);
// Return the error code.
hr = hrError;
}
}
else if(hr == E_ACCESSDENIED)
{
// No permission. Take appropriate action.
}
SafeRelease(&pPropsToSet);
SafeRelease(&pPropsReturn);
return hr;
}
관련 항목