Win32 API 日本語リファレンス
ホームStorage.OfflineFiles › IOfflineFilesItemContainer

IOfflineFilesItemContainer

COM
IID3836f049-9413-45dd-bf46-b5aaa82dc310継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

オフラインファイルキャッシュ内の項目列挙機能にアクセスするために使用します。

メソッド 2

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

vtbl 3 HRESULT EnumItems(DWORD dwQueryFlags, IEnumOfflineFilesItems** ppenum)

このメソッドを実装するキャッシュ項目の子項目の列挙子を返します。(IOfflineFilesItemContainer.EnumItems)

dwQueryFlagsDWORDin

列挙時に実行するクエリ処理の量に影響するフラグです。このパラメーターには、次のビットフラグを 1 つ以上指定できます。

OFFLINEFILES_ITEM_QUERY_REMOTEINFO (0x00000001)

このフラグは将来の使用のために予約されています。

OFFLINEFILES_ITEM_QUERY_CONNECTIONSTATE (0x00000002)

このフラグを設定すると、列挙操作に、項目の接続状態(オンラインまたはオフライン)に関する情報を取得するためのオフラインファイルストアへの追加の呼び出しが含まれます。このフラグを設定しない場合、列挙にこの追加の操作は含まれず、接続情報は必要になった時点でオンデマンドに自動的に照会されます。

OFFLINEFILES_ITEM_QUERY_LOCALDIRTYBYTECOUNT (0x00000004)

このフラグを設定すると、検索操作に、ローカルのオフラインファイルキャッシュ内の該当ファイルについて未同期("ダーティ")データの量(バイト単位)に関する情報を取得するためのオフラインファイルストアへの追加の呼び出しが含まれます。

OFFLINEFILES_ITEM_QUERY_REMOTEDIRTYBYTECOUNT (0x00000008)

このフラグは将来の使用のために予約されています。

OFFLINEFILES_ITEM_QUERY_INCLUDETRANSPARENTCACHE (0x00000010)

管理者が、任意のユーザーによってキャッシュされた項目を検索できるようにします。このフラグが設定されていて、呼び出し元が管理者でない場合、メソッドの呼び出しは失敗します。

ppenumIEnumOfflineFilesItems**outIOfflineFilesItem インターフェイスポインターの列挙子です。

戻り値

成功した場合は S_OK を、それ以外の場合はエラー値を返します。

解説(Remarks)

キャッシュ全体をトップダウンで列挙するには、次の手順を実行します。

  1. CLSID_OfflineFilesCache のインスタンスを作成し、その IOfflineFilesItemContainer インターフェイスを取得します。
  2. EnumItems メソッドを呼び出して、サーバーエントリの列挙子を取得します。
  3. 返された各エントリに対して、IOfflineFilesItemContainer を要求する QueryInterface を呼び出します。
  4. QueryInterface が成功した場合、その項目は子をサポートしています。その場合は各子を列挙し、それぞれに対して IOfflineFilesItemContainer を要求する QueryInterface を呼び出します。このパターンを再帰的に適用することで、キャッシュ全体を列挙できます。

この例では、単純な再帰的実装を用いてオフラインファイルキャッシュをトップダウンで走査する方法を示します。

HRESULT EnumItems(IOfflineFilesItemContainer *pContainer);

//
// Emits the item's path string to the console.
//
HRESULT ReportItem(
    IOfflineFilesItem *pItem
    )
{
    LPWSTR pszPath;
    HRESULT hr = pItem->GetPath(&pszPath);
    if (SUCCEEDED(hr))
    {
        LPCWSTR pszType = L"";
        OFFLINEFILES_ITEM_TYPE ItemType;
        hr = pItem->GetItemType(&ItemType);
        if (SUCCEEDED(hr))
        {
            switch(ItemType)
            {
                case OFFLINEFILES_ITEM_TYPE_SERVER:
                    pszType = L" [SERVER]";
                    break;

                case OFFLINEFILES_ITEM_TYPE_SHARE:
                    pszType = L" [SHARE]";
                    break;

                case OFFLINEFILES_ITEM_TYPE_DIRECTORY:
                    pszType = L" [DIR]";
                    break;

                default:
                    break;
            }
            wprintf(L"%s%s", pszPath, pszType);
        }
        CoTaskMemFree(pszPath);
    }
    return hr;
}

//
// Processes the "current" item then recursively enumerate children
// if the item is a container (server, share, directory).
//
HRESULT ProcessItem(
    IOfflineFilesItem *pItem
    )
{
    HRESULT hr = ReportItem(pItem);
    if (SUCCEEDED(hr))
    {
        IOfflineFilesItemContainer *pContainer;
        hr = pItem->QueryInterface(IID_IOfflineFilesItemContainer,
                                   (void **)&pContainer);
        if (SUCCEEDED(hr))
        {
            EnumItems(pContainer);
            pContainer->Release();
        }
    }
    return hr;
}

//
// Enumerate the items in a container.
//
HRESULT EnumItems(
    IOfflineFilesItemContainer *pContainer
    )
{
    IEnumOfflineFilesItems *pEnum;
    HRESULT hr = pContainer->EnumItems(0, &pEnum);
    if (SUCCEEDED(hr))
    {
        IOfflineFilesItem *pItem;
        ULONG celt;
        while(S_OK == (hr = pEnum->Next(1, &pItem, &celt)))
        {
            ProcessItem(pItem);
            pItem->Release();
        }
        pEnum->Release();
    }
    return hr;
}

HRESULT EnumItemsInCache(
    IOfflineFilesCache *pCache
    )
{
    //
    // The "cache" object is a container of "server" items.
    //
    IOfflineFilesItemContainer *pContainer;
    HRESULT hr = pCache->QueryInterface(IID_IOfflineFilesItemContainer,
                                        (void **)&pContainer);
    if (SUCCEEDED(hr))
    {
        hr = EnumItems(pContainer);
    }
    return hr;
}

int wmain(int argc, __in_ecount(argc) WCHAR* argv[])
{
    HRESULT hr = CoInitialize(NULL);
    if (SUCCEEDED(hr))
    {
        //
        // The "cache" object is the entry point into the
        // Offline Files COM API.
        //
        IOfflineFilesCache *pCache;
        hr = CoCreateInstance(CLSID_OfflineFilesCache,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_IOfflineFilesCache,
                              (void **)&pCache);
        if (SUCCEEDED(hr))
        {
            hr = EnumItemsInCache(pCache);
            pCache->Release();
        }
        CoUninitialize();
    }
    return 0;
}
vtbl 4 HRESULT EnumItemsEx(IOfflineFilesItemFilter* pIncludeFileFilter, IOfflineFilesItemFilter* pIncludeDirFilter, IOfflineFilesItemFilter* pExcludeFileFilter, IOfflineFilesItemFilter* pExcludeDirFilter, DWORD dwEnumFlags, DWORD dwQueryFlags, IEnumOfflineFilesItems** ppenum)

このメソッドを実装するキャッシュ項目の子項目の列挙子を返します。(IOfflineFilesItemContainer.EnumItemsEx)

pIncludeFileFilterIOfflineFilesItemFilter*inoptional指定した場合、ファイルを含めるかどうかの判定に適用するフィルターを参照します。このパラメーターは省略可能で、NULL を指定できます。
pIncludeDirFilterIOfflineFilesItemFilter*inoptional指定した場合、ディレクトリを含めるかどうかの判定に適用するフィルターを参照します。このパラメーターは省略可能で、NULL を指定できます。
pExcludeFileFilterIOfflineFilesItemFilter*inoptional指定した場合、ファイルを除外するかどうかの判定に適用するフィルターを参照します。このパラメーターは省略可能で、NULL を指定できます。
pExcludeDirFilterIOfflineFilesItemFilter*inoptional指定した場合、ディレクトリを除外するかどうかの判定に適用するフィルターを参照します。このパラメーターは省略可能で、NULL を指定できます。
dwEnumFlagsDWORDin

実行される列挙の種類に影響するフラグです。このパラメーターには、次のフラグビットを 1 つ以上指定できます。

OFFLINEFILES_ENUM_FLAT (0x00000001)

このフラグを設定すると、返される列挙子はオフラインファイルキャッシュ内のその項目のすべての子孫を列挙します。このフラグを設定しない場合、直下の子のみが列挙されます。

OFFLINEFILES_ENUM_FLAT_FILESONLY (0x00000002)

このフラグを設定すると、列挙ではファイル項目のみが返されます。サーバー、共有、ディレクトリの各エントリは含まれません。OFFLINEFILES_ENUM_FLAT フラグが設定されていない場合、このフラグは効果を持ちません。

dwQueryFlagsDWORDin

列挙時に実行するクエリ処理の量に影響するフラグです。このパラメーターには、次のビットフラグを 1 つ以上指定できます。

OFFLINEFILES_ITEM_QUERY_REMOTEINFO (0x00000001)

このフラグは将来の使用のために予約されています。

OFFLINEFILES_ITEM_QUERY_CONNECTIONSTATE (0x00000002)

このフラグを設定すると、列挙操作に、項目の接続状態(オンラインまたはオフライン)に関する情報を取得するためのオフラインファイルストアへの追加の呼び出しが含まれます。このフラグを設定しない場合、列挙にこの追加の操作は含まれません。

OFFLINEFILES_ITEM_QUERY_LOCALDIRTYBYTECOUNT (0x00000004)

このフラグを設定すると、検索操作に、ローカルのオフラインファイルキャッシュ内の該当ファイルについて未同期("ダーティ")データの量(バイト単位)に関する情報を取得するためのオフラインファイルストアへの追加の呼び出しが含まれます。

OFFLINEFILES_ITEM_QUERY_REMOTEDIRTYBYTECOUNT (0x00000008)

このフラグは将来の使用のために予約されています。

OFFLINEFILES_ITEM_QUERY_INCLUDETRANSPARENTCACHE (0x00000010)

管理者が、任意のユーザーによってキャッシュされた項目を検索できるようにします。このフラグが設定されていて、呼び出し元が管理者でない場合、メソッドの呼び出しは失敗します。

ppenumIEnumOfflineFilesItems**outIOfflineFilesItem インターフェイスポインターの列挙子です。

戻り値

成功した場合は S_OK を、それ以外の場合はエラー値を返します。

解説(Remarks)

キャッシュ全体をトップダウンで列挙するには、次の手順を実行します。

  1. CLSID_OfflineFilesCache のインスタンスを作成し、その IOfflineFilesItemContainer インターフェイスを取得します。
  2. EnumItemsEx メソッドを呼び出して、サーバーエントリの列挙子を取得します。
  3. 返された各エントリに対して、IOfflineFilesItemContainer を要求する QueryInterface を呼び出します。
  4. QueryInterface が成功した場合、その項目は子をサポートしています。その場合は各子を列挙し、それぞれに対して IOfflineFilesItemContainer を要求する QueryInterface を呼び出します。このパターンを再帰的に適用することで、キャッシュ全体を列挙できます。
同一の列挙に対して、包含フィルターと除外フィルターの両方を指定することもできます。その場合、評価対象の各項目に対する結果は次のとおりです。
包含フィルターに一致 包含フィルターに不一致
除外フィルターに一致 除外 除外
除外フィルターに不一致 包含 除外

表が示すように、除外フィルターに一致する場合、または包含フィルターに一致しない場合、その項目は列挙から除外されます。項目が列挙に含まれるには、除外フィルターに一致せず、かつ包含フィルターに一致する必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IOfflineFilesItemContainer "{3836F049-9413-45DD-BF46-B5AAA82DC310}"
#usecom global IOfflineFilesItemContainer IID_IOfflineFilesItemContainer "{}"
#comfunc global IOfflineFilesItemContainer_EnumItems    3 int,sptr
#comfunc global IOfflineFilesItemContainer_EnumItemsEx  4 sptr,sptr,sptr,sptr,int,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。