ILocationReport
COM公式ドキュメント
位置レポートの親インターフェースです。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
位置レポートを生成したセンサーの ID を取得します。
| pSensorID | GUID* | out | 位置レポートを生成したセンサーの ID を受け取る SENSOR_ID のアドレスです。 |
戻り値
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
センサー ID は GUID です。
例
次の例は GetSensorID を呼び出す方法を示しています。
// センサー ID の GUID を出力する
GUID sensorID = {0};
if (SUCCEEDED(spLatLongReport->GetSensorID(&sensorID)))
{
wprintf(L"SensorID: %s\n", GUIDToString(sensorID, szGUID, ARRAYSIZE(szGUID)));
}
レポートが生成された日時を取得します。
| pCreationTime | SYSTEMTIME* | out | レポートが生成された日時を受け取る SYSTEMTIME のアドレスです。タイムスタンプは協定世界時 (UTC) で提供されます。 |
戻り値
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
位置レポートからプロパティ値を取得します。
| pKey | PROPERTYKEY* | in | 取得するプロパティの名前を指定する REFPROPERTYKEY です。 |
| pValue | PROPVARIANT* | out | プロパティ値を受け取る PROPVARIANT のアドレスです。 |
戻り値
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プロパティはプラットフォームで定義される場合と、製造元で定義される場合があります。
位置センサー向けのプラットフォーム定義の PROPERTYKEY 値は、sensors.h の位置センサーデータ型セクションで定義されています。
次の表は、位置レポートに一般的に関連付けられる、プラットフォーム定義のプロパティの一部を示しています。これらのプロパティキーは、fmtid フィールドが SENSOR_DATA_TYPE_LOCATION_GUID と等しくなります。追加のプロパティは sensors.h で確認できます。SetReport に渡す独自の位置レポートを実装する場合、この表は、レポートオブジェクトの GetValue の実装でどの値を提供する必要があるかを示しています。
| プロパティキー名と型 | 説明 |
|---|---|
| SENSOR_DATA_TYPE_LATITUDE VT_R8 | 北を正とする緯度(度)。
注意 SetReport に渡される緯度/経度レポートオブジェクトは、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_LONGITUDE VT_R8 | 東を正とする経度(度)。
注意 SetReport に渡される緯度/経度レポートオブジェクトは、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_ALTITUDE_SEALEVEL_METERS VT_R8 | 海面を基準とした高度(メートル単位)。 |
| SENSOR_DATA_TYPE_ALTITUDE_ELLIPSOID_METERS VT_R8 | 基準楕円体を基準とした高度(メートル単位)。 |
| SENSOR_DATA_TYPE_SPEED_KNOTS VT_R8 | ノット単位で測定された速度。 |
| SENSOR_DATA_TYPE_TRUE_HEADING_DEGREES VT_R8 | 真北を基準とした方位(度)。 |
| SENSOR_DATA_TYPE_MAGNETIC_HEADING_DEGREES VT_R8 | 磁北を基準とした方位(度)。 |
| SENSOR_DATA_TYPE_MAGNETIC_VARIATION VT_R8 | 磁気偏差。東を正とします。 |
| SENSOR_DATA_TYPE_ERROR_RADIUS_METERS VT_R8 | 緯度と経度の精度を示す誤差半径(メートル単位)。
注意 SetReport に渡される緯度/経度レポートオブジェクトは、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_ADDRESS1 VT_LPWSTR | 市街地住所レポートの住所の1行目。
注意 SetReport に渡される市街地住所レポートオブジェクトにこのデータが含まれている場合は、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_ADDRESS2 VT_LPWSTR | 市街地住所レポートの住所の2行目。 注意 SetReport に渡される市街地住所レポートオブジェクトにこのデータが含まれている場合は、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_CITY VT_LPWSTR | 市街地住所レポートの市区町村フィールド。 注意 SetReport に渡される市街地住所レポートオブジェクトにこのデータが含まれている場合は、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_STATE_PROVINCE VT_LPWSTR | 市街地住所レポートの都道府県/州フィールド。 注意 SetReport に渡される市街地住所レポートオブジェクトにこのデータが含まれている場合は、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_POSTALCODE VT_LPWSTR | 市街地住所レポートの郵便番号フィールド。 注意 SetReport に渡される市街地住所レポートオブジェクトにこのデータが含まれている場合は、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_COUNTRY_REGION VT_LPWSTR | 市街地住所レポートの国/地域コード。値は2文字または3文字の ISO 3166 国コードである必要があります。
注意 SetReport に渡される市街地住所レポートオブジェクトは、GetValue の実装でこの値を提供する必要があります。
|
| SENSOR_DATA_TYPE_ALTITUDE_ELLIPSOID_ERROR_METERS VT_R8 | 基準楕円体を基準とした高度の誤差(メートル単位)。 |
| SENSOR_DATA_TYPE_ALTITUDE_SEALEVEL_ERROR_METERS VT_R8 | 海面を基準とした高度の誤差(メートル単位)。 |
次の表は、位置レポートに現れる可能性があるものの、位置に固有ではない、その他のプラットフォーム定義のプロパティを示しています。これらのプロパティキーの fmtid フィールドは SENSOR_PROPERTY_COMMON_GUID です。
| プロパティキー名と型 | 説明 |
|---|---|
| SENSOR_PROPERTY_ACCURACY VT_UNKNOWN | センサーのデータ型名と、それに関連付けられた精度を含む IPortableDeviceValues オブジェクト。精度値は、真の値からのばらつきの可能性を表します。
精度値は、特に記載がない限り、データフィールドと同じ単位で表されます。 |
| SENSOR_PROPERTY_CHANGE_SENSITIVITY VT_UNKNOWN |
センサーのデータ型名と、それに関連付けられた変化感度値を含む IPortableDeviceValues オブジェクト。変化感度値は、SENSOR_EVENT_DATA_UPDATED イベントが発生する前にデータフィールドが変化しなければならない量を表します。
感度値は、特に記載がない限り、データフィールドと同じ単位で表されます。 たとえば、SENSOR_DATA_TYPE_TEMPERATURE_CELSIUS の変化感度値が 2 の場合、プラスマイナス2度(摂氏)の感度を表します。 |
| SENSOR_PROPERTY_CURRENT_CONNECTION_TYPE VT_UI4 | 現在の接続タイプを含む SensorConnectionType 値。 |
| SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL VT_UI4 |
センサーデータレポート生成の現在の経過時間(ミリ秒単位)。
値を 0 に設定すると、ドライバーに既定のレポート間隔を使用するよう指示します。このプロパティに 0 を受け取った後、ドライバーは照会されたときに 0 ではなく既定のレポート間隔を返す必要があります。 アプリケーションはこの値を設定して特定のレポート間隔を要求できますが、複数のアプリケーションが同じドライバーを使用している場合があります。そのため、ドライバーは内部ロジックに基づいて実際のレポート間隔を決定します。たとえば、ドライバーは常に呼び出し元から要求された最短のレポート間隔を使用する場合があります。 |
| SENSOR_PROPERTY_DESCRIPTION VT_LPWSTR | センサーの説明文字列。 |
| SENSOR_PROPERTY_DEVICE_PATH VT_LPWSTR |
センサーが関連付けられているデバイスインスタンスを一意に識別します。このプロパティを使用して、デバイスに複数のセンサーが含まれているかどうかを判断できます。
プラットフォームはドライバーに照会せずにこの値をアプリケーションに提供するため、デバイスドライバーはこのプロパティをサポートする必要はありません。 |
| SENSOR_PROPERTY_FRIENDLY_NAME VT_LPWSTR | デバイスのフレンドリ名。 |
| SENSOR_PROPERTY_LOCATION_DESIRED_ACCURACY VT_UI4 | クライアントアプリケーションが要求する精度処理の種類を示す列挙値。LOCATION_DESIRED_ACCURACY_DEFAULT (0) は、センサーが電力使用やその他のコストを最適化できる精度を使用すべきであることを示します。
LOCATION_DESIRED_ACCURACY_HIGH (1) は、センサーが可能な限り最も正確なレポートを提供すべきであることを示します。これには、料金が発生する可能性のあるサービスの使用や、より高いレベルのバッテリー電力または接続帯域幅の消費が含まれます。 |
| SENSOR_PROPERTY_MANUFACTURER VT_LPWSTR | 製造元の名前。 |
| SENSOR_PROPERTY_MIN_REPORT_INTERVAL VT_UI4 | センサーデータレポート生成に対してハードウェアがサポートする最小経過時間設定(ミリ秒単位)。 |
| SENSOR_PROPERTY_MODEL VT_LPWSTR | センサーのモデル名。 |
| SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID VT_CLSID | センサーを識別する GUID。この値は、デバイス上の各センサーごとに、またはコンピューターで列挙される同じモデルのデバイス間で一意である必要があります。 |
| SENSOR_PROPERTY_RANGE_MAXIMUM VT_UKNOWN | センサーのデータフィールド名と、それに関連付けられた最大値を含む IPortableDeviceValues オブジェクト。 |
| SENSOR_PROPERTY_RANGE_MINIMUM VT_UKNOWN | センサーのデータフィールド名と、それに関連付けられた最小値を含む IPortableDeviceValues オブジェクト。 |
| SENSOR_PROPERTY_RESOLUTION VT_UKNOWN | センサーのデータフィールド名と、それに関連付けられた分解能を含む IPortableDeviceValues オブジェクト。分解能値は、データフィールドの変化に対する感度を表します。
分解能値は、特に記載がない限り、データフィールドと同じ単位で表されます。 |
| SENSOR_PROPERTY_SERIAL_NUMBER VT_LPWSTR | センサーのシリアル番号。 |
| SENSOR_PROPERTY_STATE VT_UI4 | 現在のセンサー状態を含む SensorState 値。 |
| SENSOR_PROPERTY_TYPE VT_CLSID | センサーの種類を識別する GUID。プラットフォーム定義のセンサーの種類は Sensors.h で定義されています。 |
例
次の例は、プロパティ値を取得するために GetValue を呼び出す方法を示しています。この例の定数を使用するには sensors.h をインクルードする必要があります。
PROPVARIANT pv;
HRESULT hr = spLatLongReport->GetValue(SENSOR_DATA_TYPE_LATITUDE_DEGREES, &pv);
次の例は、独自のレポートオブジェクトで GetValue を実装する方法を示しています。この実装により、呼び出し元はいくつかの位置レポートフィールドの値を取得できます。このコードでは sensors.h と provarutil.h をインクルードする必要があります。
STDMETHODIMP CLocationReport::GetValue(REFPROPERTYKEY pKey, PROPVARIANT *pValue)
{
HRESULT hr = S_OK;
if (pKey.fmtid == SENSOR_DATA_TYPE_LOCATION_GUID)
{
// 市街地住所レポートのプロパティ
if (pKey.pid == SENSOR_DATA_TYPE_ADDRESS1.pid)
{
hr = InitPropVariantFromString(m_address1, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_ADDRESS2.pid)
{
hr = InitPropVariantFromString(m_address2, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_CITY.pid)
{
hr = InitPropVariantFromString(m_city, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_STATE_PROVINCE.pid)
{
hr = InitPropVariantFromString(m_stateprovince, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_POSTALCODE.pid)
{
hr = InitPropVariantFromString(m_postalcode, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_COUNTRY_REGION.pid)
{
hr = InitPropVariantFromString(m_countryregion, pValue);
}
// 緯度/経度レポートのプロパティ
else if (pKey.pid == SENSOR_DATA_TYPE_LATITUDE_DEGREES.pid)
{
hr = InitPropVariantFromDouble(m_latitude, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_LONGITUDE_DEGREES.pid)
{
hr = InitPropVariantFromDouble(m_longitude, pValue);
}
else if (pKey.pid == SENSOR_DATA_TYPE_ERROR_RADIUS_METERS.pid)
{
hr = InitPropVariantFromDouble(m_errorradius, pValue);
}
else
{
hr = HRESULT_FROM_WIN32(ERROR_NO_DATA);
PropVariantInit(pValue);
}
}
return hr;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ILocationReport "{C8B7F7EE-75D0-4DB9-B62D-7A0F369CA456}" #usecom global ILocationReport IID_ILocationReport "{}" #comfunc global ILocationReport_GetSensorID 3 var #comfunc global ILocationReport_GetTimestamp 4 var #comfunc global ILocationReport_GetValue 5 var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_ILocationReport "{C8B7F7EE-75D0-4DB9-B62D-7A0F369CA456}" #usecom global ILocationReport IID_ILocationReport "{}" #comfunc global ILocationReport_GetSensorID 3 sptr #comfunc global ILocationReport_GetTimestamp 4 sptr #comfunc global ILocationReport_GetValue 5 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。