Win32 API 日本語リファレンス
ホームUI.Shell › ISyncMgrSyncCallback

ISyncMgrSyncCallback

COM
IID884ccd87-b139-4937-a4ba-4f8e19513fbe継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

同期処理が Sync Center に進行状況やイベントを報告したり、処理がキャンセルされたかどうかを問い合わせたりできるようにするメソッドを公開します。

解説(Remarks)

このインターフェイスは ISyncMgrSessionCreator::CreateSession に渡され、それが ISyncMgrHandler::Synchronize の呼び出しの中で参照されます。

ハンドラーは、各項目についてフォルダーの進行状況 UI を更新するため、また各項目の同期が完了したときに Sync Center に通知するために、このインターフェイスを呼び出すことが期待されます。

ISyncMgrSyncCallbackISyncMgrSynchronizeCallback の置き換えです。

メソッド 10

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT ReportProgress(LPWSTR pszItemID, LPWSTR pszProgressText, SYNCMGR_PROGRESS_STATUS nStatus, DWORD uCurrentStep, DWORD uMaxStep, SYNCMGR_CANCEL_REQUEST* pnCancelRequest)

単一の同期項目の同期の進行状況を Sync Center に報告します。

pszItemIDLPWSTRin現在同期中の項目の一意の ID を含むバッファーへのポインター。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。
pszProgressTextLPWSTRinこの項目に対する任意のカスタム進行状況メッセージ用の Unicode 文字列を含むバッファーへのポインター。
nStatusSYNCMGR_PROGRESS_STATUSin同期の現在の進行状況を表す SYNCMGR_PROGRESS_STATUS 列挙体の値。
uCurrentStepDWORDin同期における現在のステップ。nStatusSYNCMGR_PS_UPDATING_INDETERMINATE フラグが設定されている場合、このパラメーターは無視されます。
uMaxStepDWORDin項目の同期を完了するために必要なステップの総数。nStatusSYNCMGR_PS_UPDATING_INDETERMINATE フラグが設定されている場合、このパラメーターは無視されます。
pnCancelRequestSYNCMGR_CANCEL_REQUEST*inoutこのメソッドが戻るときに、キャンセル要求があればその性質を指定する SYNCMGR_CANCEL_REQUEST 列挙体の値を指します。

戻り値

型: HRESULT

このメソッドが成功した場合、S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

個々の同期項目ではなくハンドラーの進行状況を報告したい場合は、ISyncMgrSyncCallback::SetHandlerProgressText を呼び出します。

同期がキャンセルされた場合、ハンドラーはその項目に対して最後にもう一度 ISyncMgrSyncCallback::ReportProgress を呼び出し、nStatus パラメーターに SYNCMGR_PS_CANCELED を指定してキャンセル要求を確認します。これにより UI が更新され、ユーザーはその項目の同期を再開できるようになります。

このメソッドがいったん完了ステータス(SYNCMGR_PS_SUCCEEDEDSYNCMGR_PS_FAILED、または SYNCMGR_PS_CANCELED)を報告すると、その後に報告できるステータスは SYNCMGR_PS_FAILED のみになります。それ以外の値を指定すると、このメソッドは E_ACCESSDENIED を返し、Sync Center はその項目を失敗としてマークします。

このメソッドは Progress を置き換えます。

進行状況文字列の最大長は MAX_SYNCMGR_PROGRESSTEXT です。この定数は SyncMgr.h で定義されています。

次の例は、Synchronize メソッドによる ISyncMgrSyncCallback::ReportProgress の使用方法を示しています。

STDMETHODIMP CMyDeviceHandler::Synchronize(...)
{
    ...

    // Start synchronizing the sync item.

    ...

    // Construct a string to display in the Sync Center folder.
    // Report the progress to Sync Center.
    SYNCMGR_CANCEL_REQUEST nCancelRequest;
    hr = pCallback->ReportProgress(pszItemID,
                                   pszProgressText,
                                   SYNCMGR_PS_UPDATING,
                                   uCurrentStep,
                                   uMaxStep,
                                   &nCancelRequest);
    if (SUCCEEDED(hr))
    {
        if (nCancelRequest != SYNCMGR_CR_NONE)
        {
            // Synchronization was canceled.
            hr = pCallback->ReportProgress(pszItemID,
                                           pszProgressText,
                                           SYNCMGR_PS_CANCELED,
                                           uCurrentStep,
                                           uMaxStep,
                                           NULL);
        }
    }
    ...
}
vtbl 4 HRESULT SetHandlerProgressText(LPWSTR pszProgressText, SYNCMGR_CANCEL_REQUEST* pnCancelRequest)

ハンドラーが同期を実行している間、そのハンドラーの情報フィールドの内容を設定します。

pszProgressTextLPWSTRinコメントテキストを含むバッファーへのポインター。
pnCancelRequestSYNCMGR_CANCEL_REQUEST*inoutキャンセル要求があればその性質を指定する SYNCMGR_CANCEL_REQUEST 列挙体の値。

戻り値

型: HRESULT

このメソッドが成功した場合、S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

vtbl 5 HRESULT ReportEvent(LPWSTR pszItemID, SYNCMGR_EVENT_LEVEL nLevel, SYNCMGR_EVENT_FLAGS nFlags, LPWSTR pszName, LPWSTR pszDescription, LPWSTR pszLinkText, LPWSTR pszLinkReference, LPWSTR pszContext, GUID* pguidEventID)

同期中の項目について、Sync Results フォルダーに追加するイベントを提供します。

pszItemIDLPWSTRin現在同期中の項目の一意の ID を含むバッファーへのポインター。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。
nLevelSYNCMGR_EVENT_LEVELin関係するイベントの種類を宣言する SYNCMGR_EVENT_LEVEL 列挙体の値。
nFlagsSYNCMGR_EVENT_FLAGSin使用されません。
pszNameLPWSTRinイベントの名前を含むバッファーへのポインター。
pszDescriptionLPWSTRinイベントの説明を含むバッファーへのポインター。
pszLinkTextLPWSTRin項目へのハイパーリンクで使用するテキストを含むバッファーへのポインター。このパラメーターは NULL にできます。
pszLinkReferenceLPWSTRin項目の URL を含むバッファーへのポインター。このパラメーターは NULL にできます。
pszContextLPWSTRinイベントに関連付けるハンドラー固有のデータ。
pguidEventIDGUID*outこのメソッドが戻るときに、イベントの一意の ID へのポインターを格納します。

戻り値

型: HRESULT

このメソッドが成功した場合、S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

ハンドラーが同期結果に関する詳細をユーザーに提供できるように、ハンドラーが報告する個々の同期結果のプロパティシートを拡張できます。

このメソッドは LogError を置き換えます。

イベントはメモリ内にのみ格納されるため、ユーザーがログオフまたはシャットダウンすると、すべてのイベントがクリアされます。これは、カスタムの ISyncMgrEventStore を実装する理由の 1 つです。カスタム実装は、ファイル、ネットワーク経由、レジストリなど、任意の場所からイベントを提供できます。ただし、Sync Results フォルダーには、内部イベントストアと同期ハンドラーが提供するカスタムイベントストアの両方から提供されるイベントが表示されます。

次の例は、Synchronize メソッドによる ISyncMgrSyncCallback::ReportProgress の使用方法を示しています。

STDMETHODIMP CMyDeviceHandler::Synchronize(...)
{
    ...
    // Get the event receiver interface.
    ISyncMgrEventReceiver *pEventReceiver = NULL;
    hr = pCallback->QueryInterface(IID_ISyncMgrEventReceiver,
                                   (void **) &pEventReceiver);

    ...

    // Start synchronizing the sync item.

    ...

    // Generate a GUID for this item.
    // Construct a string to display in the Sync Results folder.
    // Store the information about this event so we can display more details.
    // Report the event to Sync Center.
    hr = pEventReceiver->ReportEvent(pszItemID,
                                     SYNCMGR_EL_INFORMATION,
                                     SYNCMGR_EF_NONE,
                                     pszEventName,
                                     pszEventDescription,
                                     NULL,
                                     NULL,
                                     NULL,
                                     &guidEventID);
    ...
}
vtbl 6 HRESULT CanContinue(LPWSTR pszItemID)

同期がキャンセルされたかどうかを判定します。

pszItemIDLPWSTRin項目の ID を含むバッファーへのポインター。

戻り値

型: HRESULT

戻り値 意味
S_OK キャンセルは要求されていません。同期を続行できます。
S_FALSE キャンセルが要求されました。ハンドラーは ISyncMgrSyncCallback::ReportProgress を呼び出し、nStatus パラメーターに SYNCMGR_PS_CANCELED を指定する必要があります。
E_INVALIDARG pszItemID が指す値が Sync Center にとって不明であるか、このハンドラーが管理する項目ではありません。

pszItemIDNULL または空文字列の場合、戻り値はハンドラー全体に対してキャンセルが要求されているかどうかによって決まります。

解説(Remarks)

同期は、コンテキストメニューまたはコマンドモジュールの 停止 または すべて停止 タスクをクリックすることでユーザーがキャンセルできます。また、アプリケーションが ISyncMgrControl インターフェイスの停止メソッドのいずれかを呼び出したときにもキャンセルできます。

この機能を独立したメソッドとして実装することで、ハンドラーは進行状況を報告することなくキャンセルを確認できます。

次の例は、Synchronize メソッドによる ISyncMgrSyncCallback::CanContinue の使用方法を示しています。

HRESULT CMyDeviceHandler::Synchronize(...)
{
    ...

    // Start synchronizing the sync items.

    ...

    // If a cancellation has been requested, stop the sync and exit.
    if (pCallback->CanContinue(pszItemID) == S_FALSE)
    {
        // End the sync operation and exit the function.
        hr = pCallback->ReportProgress(pszItemID,
                                       pszCancelMessage,
                                       SYNCMGR_PS_CANCELED,
                                       uCurrentStep,
                                       uMaxStep,
                                       NULL);
    }
    ...
}
vtbl 7 HRESULT QueryForAdditionalItems(IEnumString** ppenumItemIDs, IEnumUnknown** ppenumPunks)

同期の保留要求がある項目のセットの列挙子を取得します。これは、現在の同期が完了した後に同期される項目のセットです。

ppenumItemIDsIEnumString**outこのメソッドが戻るときに、同期項目 ID を列挙する IEnumString のインスタンスへのポインターのアドレスを格納します。保留中の項目がない場合、この値は NULL になります。
ppenumPunksIEnumUnknown**outこのメソッドが戻るときに、StartHandlerSync または StartItemSync に渡される IUnknown インターフェイスを列挙する IEnumUnknown のインスタンスへのポインターのアドレスを格納します。保留中のインターフェイスがない場合、この値は NULL になります。

戻り値

型: HRESULT

成功した場合は S_OK を、それ以外の場合はエラー値を返します。保留中の項目がない場合は S_FALSE を返します。

解説(Remarks)

取得した列挙子インターフェイスの Next メソッドの呼び出しで取得される項目 ID は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。呼び出し側のアプリケーションは、Next メソッドを通じて取得した各項目 ID を CoTaskMemFree を使用して解放する責任があります。

vtbl 8 HRESULT AddItemToSession(LPWSTR pszItemID)

指定された項目を、現在同期中の項目のセットに追加します。

pszItemIDLPWSTRin追加する項目の一意の ID を含むバッファーへのポインター。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。

戻り値

型: HRESULT

成功した場合は S_OK を、それ以外の場合はエラー値を返します。pszItemID がすでにセッションの一部である場合は E_INVALIDARG を返します。

解説(Remarks)

ISyncMgrSyncCallback::AddItemToSession は同期ハンドラーによって呼び出されます。

次の例は、Synchronize メソッドによる ISyncMgrSyncCallback::AddItemToSession の使用方法を示しています。

HRESULT CMyDeviceHandler::Synchronize(...)
{
    ...

    // Start synchronizing the handler.

    ...

    // Check for additional items to sync.
    IEnumString *penumItemIDs = NULL;
    
    hr = pCallback->QueryForAdditionalItems(&penumItemIDs);
    if (hr == S_OK)
    {
        while (hr == S_OK)
        {
            LPWSTR pszItemID;
            ULONG cFetched;
            hr = penumItemIDs->Next(1, &pszItemID, &cFetched);
            if ((hr == S_OK) && (cFetched == 1))
            {
                // Add this item to the set of items we are syncing.
                hr = pCallback->AddItemToSession(pszItemID);
                CoTaskMemFree(pszItemID);
            }
        }
        penumItemIDs->Release();
    }
    ...
}
vtbl 9 HRESULT AddIUnknownToSession(IUnknown* punk)
punkIUnknown*inセッションに追加するオブジェクトの IUnknown へのポインタである。
vtbl 10 HRESULT ProposeItem(ISyncMgrSyncItem* pNewItem)

以前に列挙された項目のセットへの新しい項目の追加を提案します。

pNewItemISyncMgrSyncItem*in新しい項目を表す ISyncMgrSyncItem のインスタンスへのポインター。

戻り値

型: HRESULT

成功した場合は S_OK を、それ以外の場合はエラー値を返します。pszItemID がすでに存在する場合は E_INVALIDARG を返します。

解説(Remarks)

ISyncMgrSyncCallback::ProposeItem は通常、項目が正常に同期されるまで同期セットの一部と見なされない場合に呼び出されます。Sync Center は、ISyncMgrSyncCallback::CommitItem メソッドが呼び出されるまで、この項目を UI に表示しません。

次の例は、Synchronize メソッドによる ISyncMgrSyncCallback::ProposeItemISyncMgrSyncCallback::CommitItem の使用方法を示しています。

HRESULT CMyDeviceHandler::Synchronize(...)
{
    ...

    // Start synchronizing the handler.

    ...

    // Find items waiting to be created.
    for (...)
    {
        // Create the item.
        ISyncMgrSyncItem *pNewItem = NULL;
        LPWSTR szItemID[MAX_SYNCMGR_ID];
        
        hr = GetNextNewItem(&pNewItem, szItemID, ARRAYSIZE(szItemID));
        if (SUCCEEDED(hr))
        {
            // Propose this item to Sync Center.
            hr = pCallback->ProposeItem(pNewItem);
            if (SUCCEEDED(hr))
            {
                // Synchronize the item.
                // Synchronization was successful.  Commit the item.
                hr = pCallback->CommitItem(szItemID);
            }
            pNewItem->Release();
        }
    }
    ...
}
vtbl 11 HRESULT CommitItem(LPWSTR pszItemID)

指定された項目をハンドラーの同期セットのメンバーとして確定し、UI に表示すべきであることを確定します。

pszItemIDLPWSTRin確定する項目の一意の ID を含むバッファーへのポインター。この文字列は、終端の null 文字を含めて最大長 MAX_SYNCMGR_ID です。

戻り値

型: HRESULT

成功した場合は S_OK を、それ以外の場合はエラー値を返します。項目が最初に ISyncMgrSyncCallback::ProposeItem を通じて送信されていない場合、または項目がすでに現在のセッションの一部である場合は E_INVALIDARG を返します。

vtbl 12 HRESULT ReportManualSync()

Sync Center の UI の外部から手動で要求された同期操作が実行されていることを報告します。

戻り値

型: HRESULT

このメソッドが成功した場合、S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ISyncMgrSyncCallback "{884CCD87-B139-4937-A4BA-4F8E19513FBE}"
#usecom global ISyncMgrSyncCallback IID_ISyncMgrSyncCallback "{}"
#comfunc global ISyncMgrSyncCallback_ReportProgress           3 wstr,wstr,int,int,int,var
#comfunc global ISyncMgrSyncCallback_SetHandlerProgressText   4 wstr,var
#comfunc global ISyncMgrSyncCallback_ReportEvent              5 wstr,int,int,wstr,wstr,wstr,wstr,wstr,var
#comfunc global ISyncMgrSyncCallback_CanContinue              6 wstr
#comfunc global ISyncMgrSyncCallback_QueryForAdditionalItems  7 sptr,sptr
#comfunc global ISyncMgrSyncCallback_AddItemToSession         8 wstr
#comfunc global ISyncMgrSyncCallback_AddIUnknownToSession     9 sptr
#comfunc global ISyncMgrSyncCallback_ProposeItem              10 sptr
#comfunc global ISyncMgrSyncCallback_CommitItem               11 wstr
#comfunc global ISyncMgrSyncCallback_ReportManualSync         12
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。