ISyncMgrSyncItem
COM公式ドキュメント
単一の同期アイテムに作用し、そこから情報を取得するメソッドを公開します。これにより、ハンドラーは同期アイテムを独立したオブジェクトとして管理できます。
解説(Remarks)
同期アイテムは通常、データのグループ(たとえば複数のファイルを含むフォルダー)を表します。この同期アイテムをインターフェイスとして表現することで、アイテムをオブジェクトとして容易に管理・実装できます。そのオブジェクトは、アイテムがアクセスされたときにアイテムの状態を保持します。
同期アイテムを ISyncMgrSyncItem として表現することで、他の同期アイテムを含む同期アイテムをサポートすることも可能になります。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
同期アイテムの一意な ID を取得します。
| ppszItemID | LPWSTR* | out | このメソッドが返るとき、アイテムの ID を格納したバッファーへのポインターを格納します。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドで取得される ID は変更できません。通常、ID は GUID 文字列の形式ですが、これは必須ではありません。ID は、ハンドラーのコンテキスト内で一意である限り、任意の文字列で構いません。
GetItemID が失敗するか、ppszItemID に空文字列が返された場合、その同期アイテムはハンドラーのフォルダーに表示されず、同期センターはそのアイテムを同期しようとしません。
このメソッドで取得される ID は、フォルダー UI で System.Sync.ItemID (PKEY_Sync_HandlerID) プロパティとして利用できます。
アイテムは、ppszComment が指す文字列バッファーを CoTaskMemAlloc によって割り当てる責任を負います。同期センターは、CoTaskMemFree によってその文字列バッファーを解放します。
古いバージョンの Sync Manager の実装では、このデータは SYNCMGRITEM 構造体を通じて取得されていました。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetItemID(__out LPWSTR *ppszItemID)
{
HRESULT hr = S_OK;
*ppszName = NULL;
// Generate the string version of the ID.
if (_pszItemID == NULL)
{
LPOLESTR pszItemID = NULL;
hr = StringFromCLSID(_guidItemID, &_pszItemID);
}
if (SUCCEEDED(hr))
{
// Duplicate the item ID string for the caller.
hr = SHCoAllocString(_pszItemID, ppszItemID);
}
return hr;
}
同期アイテムの UI 表示名を取得します。
| ppszName | LPWSTR* | out | このメソッドが返るとき、アイテムの表示名を格納したバッファーへのポインターを格納します。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_NAME です。これより長い文字列は切り詰められます。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
GetName が失敗するか、ppszItemID に空文字列が返された場合、その同期アイテムはハンドラーのフォルダーに表示されず、同期センターはそのアイテムを同期しようとしません。
このメソッドで取得される ID は、ハンドラーのフォルダー UI で System.DisplayName (PKEY_DisplayName) プロパティとして利用できます。
アイテムは、ppszComment が指す文字列バッファーを CoTaskMemAlloc によって割り当てる責任を負います。同期センターは、CoTaskMemFree によってその文字列バッファーを解放します。
同期センターは、UpdateItem メソッドが呼び出されるたびに、このメソッドを呼び出します。
古いバージョンの Sync Manager の実装では、この情報は SYNCMGRHANDLERINFO 構造体を通じて取得されていました。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetName(__out LPWSTR *ppszName)
{
*ppszName = NULL;
HRESULT hr = SHCoAllocString(_pszItemName, ppszName);
return hr;
}
同期アイテムのプロパティを取得します。
| ppItemInfo | ISyncMgrSyncItemInfo** | out | このメソッドが返るとき、アイテムを表す ISyncMgrSyncItemInfo インターフェイスのインスタンスへのポインターのアドレスを格納します。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
GetItemInfo が失敗しても、その同期アイテムはハンドラーのフォルダーに引き続き表示され、同期センターは引き続き同期を行いますが、すべてのプロパティには既定値が使用されます。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetItemInfo(
__out ISyncMgrSyncItemInfo **ppItemInfo)
{
*ppItemInfo = NULL;
HRESULT hr = QueryInterface(IID_ISyncMgrSyncItemInfo, (void**)ppItemInfo);
return hr;
}
アイテムに関連する特定の種類のオブジェクトを作成します。
| rguidObjectID | GUID* | in | 作成するオブジェクトの種類を識別する GUID。shlguid.h で定義されている次の値のいずれかです。 SYNCMGR_OBJECTID_BrowseContentISyncMgrUIOperation インターフェイスを実装するオブジェクトで、ユーザーがアイテムの内容を参照できる UI を表示します。 同期センターは、GetCapabilities で取得されるマスクに SYNCMGR_ICM_CAN_BROWSE_CONTENT 機能フラグが設定されている場合にのみ、このオブジェクトを要求します。 SYNCMGR_OBJECTID_ConflictStoreISyncMgrConflictStore インターフェイスを実装するオブジェクトで、アイテムが競合を提供できるようにします。これらの競合は、同期センターの競合フォルダーに表示されます。競合ストアには、そのアイテムの競合のみを含めるべきです。ハンドラーのすべてのアイテムの競合を含めるには、同期センターが GetObject を呼び出します。 同期センターは、GetCapabilities で取得されるマスクに SYNCMGR_ICM_CONFLICT_STORE 機能フラグが設定されている場合にのみ、このオブジェクトを要求します。 SYNCMGR_OBJECTID_EventStoreISyncMgrEventStore インターフェイスを実装するオブジェクトで、アイテムが独自のイベントソースを提供できるようにします。これらのイベントは、同期結果フォルダーに表示されます。イベントストアには、そのアイテムのイベントのみを含めるべきです。ハンドラーのすべてのアイテムのイベントを含めるには、同期センターが GetObject を呼び出します。 同期センターは、GetCapabilities で取得されるマスクに SYNCMGR_ICM_EVENT_STORE 機能フラグが設定されている場合にのみ、このオブジェクトを要求します。 アイテムがイベントストアを提供することは必須ではありません。同期センターが提供する既定のイベントストアがアイテムの要件を満たす場合は、それを使用できます。 SYNCMGR_OBJECTID_Iconアイテムのアイコンを表示するために使用される IExtractIcon インターフェイスを実装するアイコン抽出オブジェクト。このオブジェクトは、アイテムが実行時に動的にアイコンを取得する場合にのみ提供すべきです。アイコンを提供する推奨方法は、レジストリに DefaultIcon としてアイコンを登録することです。 同期センターは、GetCapabilities で取得されるマスクに SYNCMGR_ICM_PROVIDES_ICON 機能フラグが設定されている場合にのみ、このオブジェクトを要求します。 SYNCMGR_OBJECTID_QueryBeforeDeleteISyncMgrUIOperation インターフェイスを実装するオブジェクトで、ユーザーがハンドラーのフォルダーでアイテムを選択して 削除 タスクを選択したときに UI を表示します。このオブジェクトを要求する前に、同期センターはこの操作用の別スレッドとアイテムの新しいインスタンスの両方を作成します。 同期センターは、GetCapabilities で取得されるマスクに SYNCMGR_ICM_CAN_DELETE フラグと SYNCMGR_ICM_QUERY_BEFORE_DELETE フラグが設定されている場合にのみ、このオブジェクトを要求します。 SYNCMGR_OBJECTID_QueryBeforeEnableISyncMgrUIOperation インターフェイスを実装するオブジェクトで、ユーザーが同期センターのフォルダーでアイテムを選択して 有効化 タスクを選択したときに UI を表示します。このオブジェクトを要求する前に、同期センターはこの操作用の別スレッドとアイテムの新しいインスタンスの両方を作成します。 同期センターは、SYNCMGR_ICM_QUERY_BEFORE_ENABLE 機能フラグが設定されており、かつ SYNCMGR_IPM_PREVENT_ENABLE ポリシーフラグが設定されていない場合にのみ、このオブジェクトを要求します。 SYNCMGR_OBJECTID_QueryBeforeDisableISyncMgrUIOperation インターフェイスを実装するオブジェクトで、ユーザーがハンドラーのフォルダーでアイテムを選択して 無効化 タスクを選択したときに UI を表示します。このオブジェクトを要求する前に、同期センターはこの操作用の別スレッドとアイテムの新しいインスタンスの両方を作成します。 同期センターは、SYNCMGR_ICM_QUERY_BEFORE_DELETE 機能フラグが設定されており、かつ SYNCMGR_IPM_PREVENT_DISABLE ポリシーフラグが設定されていない場合にのみ、このオブジェクトを要求します。 |
| riid | GUID* | in | 要求するインターフェイスの IID。これは rguidObjectID で指定されたオブジェクトの種類に依存します。 |
| ppv | void** | out | このメソッドが返るとき、要求されたインターフェイスへのポインターのアドレスを格納します。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合はエラー値を返します。アイテムが要求された種類のオブジェクトをサポートしていない場合は E_INVALIDARG を返します。
解説(Remarks)
アイテムは、要求されたインターフェイスを自身のハンドラー上に実装することも、別のオブジェクト上に実装することもできます。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetObject(__in REFGUID rguidObjectID,
__in REFIID riid,
__out void **ppv)
{
HRESULT hr = E_INVALIDARG;
*ppv = NULL;
if (rguidObjectID == SYNCMGR_OBJECTID_QueryBeforeDelete)
{
hr = _CreateQueryBeforeDeleteObject(riid, ppv);
}
else if (rguidObjectID == SYNCMGR_OBJECTID_EventStore)
{
hr = _CreateEventStore(_pszItemID, riid, ppv);
}
return hr;
}
アイテムに定義された機能を記述するフラグのセットを取得します。
| pmCapabilities | SYNCMGR_ITEM_CAPABILITIES* | out | このメソッドが返るとき、アイテムの機能を定義する SYNCMGR_ITEM_CAPABILITIES 列挙型の値のビットごとの組み合わせへのポインターを格納します。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、UpdateItem の呼び出しに応じて同期センターによって呼び出されます。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetCapabilities(
__out SYNCMGR_ITEM_CAPABILITIES *pmCapabilities)
{
*pmCapabilities = SYNCMGR_ICM_EVENT_STORE
| SYNCMGR_ICM_CAN_DELETE
| SYNCMGR_ICM_QUERY_BEFORE_DELETE;
return S_OK;
}
アイテムによって設定されたポリシーを記述するフラグのセットを取得します。
| pmPolicies | SYNCMGR_ITEM_POLICIES* | out | このメソッドが返るとき、アイテムのポリシーを定義する SYNCMGR_ITEM_POLICIES 列挙型の値のビットごとの組み合わせへのポインターを格納します。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ポリシーとは、通常はサポートされているものの、グループポリシーによって無効化できるアクションのことです。
このメソッドは、UpdateItem の呼び出しに応じて同期センターによって呼び出されます。
例
次の例は、このメソッドの実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::GetPolicies(
__out SYNCMGR_ITEM_POLICIES *pmPolicies)
{
*pmPolicies = SYNCMGR_IPM_PREVENT_DISABLE
| SYNCMGR_IPM_HIDDEN_BY_DEFAULT;
return S_OK;
}
同期アイテムを有効または無効にします。
| fEnable | BOOL | in | 有効にする場合は TRUE、無効にする場合は FALSE。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
同期センターは、次のシナリオでこのメソッドを呼び出します。
- ユーザーがハンドラーのフォルダーでアイテムを選択し、その 有効化 タスクを起動したとき。ただし、アイテムが SYNCMGR_IPM_PREVENT_ENABLE フラグを設定していない場合に限ります。ハンドラーが SYNCMGR_OBJECTID_QueryBeforeEnable オブジェクトをサポートしている場合、このメソッドは UI 操作が成功したときにのみ呼び出されます。
- ユーザーがハンドラーのフォルダーでアイテムを選択し、その 無効化 タスクを起動したとき。ただし、アイテムが SYNCMGR_IPM_PREVENT_DISABLE フラグを設定していない場合に限ります。ハンドラーが SYNCMGR_OBJECTID_QueryBeforeDisable オブジェクトをサポートしている場合、このメソッドは UI 操作が成功したときにのみ呼び出されます。
例
次の例は、このメソッドの簡単な実装を示しています。
STDMETHODIMP CMyDeviceSyncItem::Enable(__in BOOL fEnable)
{
return E_NOTIMPL;
}
同期アイテムを削除します。
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
同期センターは、ユーザーがハンドラーのフォルダーでアイテムを選択し、その 削除 タスクを起動したときにこのメソッドを呼び出します。ただし、アイテムが SYNCMGR_ICM_CAN_DELETE フラグを設定している場合に限ります。ハンドラーが SYNCMGR_OBJECTID_QueryBeforeDeactivate オブジェクトをサポートしている場合、このメソッドは UI 操作が成功したときにのみ呼び出されます。
ハンドラーがアクティブ化されたときに何もアクションを実行する必要がない場合は、S_OK または E_NOTIMPL のいずれかを返すことができます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ISyncMgrSyncItem "{B20B24CE-2593-4F04-BD8B-7AD6C45051CD}" #usecom global ISyncMgrSyncItem IID_ISyncMgrSyncItem "{}" #comfunc global ISyncMgrSyncItem_GetItemID 3 var #comfunc global ISyncMgrSyncItem_GetName 4 var #comfunc global ISyncMgrSyncItem_GetItemInfo 5 sptr #comfunc global ISyncMgrSyncItem_GetObject 6 var,var,sptr #comfunc global ISyncMgrSyncItem_GetCapabilities 7 var #comfunc global ISyncMgrSyncItem_GetPolicies 8 var #comfunc global ISyncMgrSyncItem_Enable 9 int #comfunc global ISyncMgrSyncItem_Delete 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ISyncMgrSyncItem "{B20B24CE-2593-4F04-BD8B-7AD6C45051CD}" #usecom global ISyncMgrSyncItem IID_ISyncMgrSyncItem "{}" #comfunc global ISyncMgrSyncItem_GetItemID 3 sptr #comfunc global ISyncMgrSyncItem_GetName 4 sptr #comfunc global ISyncMgrSyncItem_GetItemInfo 5 sptr #comfunc global ISyncMgrSyncItem_GetObject 6 sptr,sptr,sptr #comfunc global ISyncMgrSyncItem_GetCapabilities 7 sptr #comfunc global ISyncMgrSyncItem_GetPolicies 8 sptr #comfunc global ISyncMgrSyncItem_Enable 9 int #comfunc global ISyncMgrSyncItem_Delete 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。