Win32 API 日本語リファレンス
ホームMedia.DeviceManager › IWMDMStorage2

IWMDMStorage2

COM
IID1ed5a144-5cd5-4683-9eff-72cbdb2d9533継承元IWMDMStorage自前メソッド開始 vtbl12

公式ドキュメント

IWMDMStorage2 インターフェースは IWMDMStorage を拡張し、名前を指定して子ストレージを取得したり、拡張属性を取得・設定したりできるようにします。IWMDMStorage3 インターフェースは、メタデータをサポートすることでこのインターフェースを拡張します。

メソッド 3

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

vtbl 12 HRESULT GetStorage(LPWSTR pszStorageName, IWMDMStorage** ppStorage)

GetStorage メソッドは、すべての子を列挙することなく、現在のストレージから名前を指定して子ストレージを直接取得します。

pszStorageNameLPWSTRinストレージ名を指定する null 終端文字列へのポインター。これは IWMDMStorage::GetName で取得される名前です。
ppStorageIWMDMStorage**out取得されたストレージオブジェクトへのポインター。ストレージが見つからなかった場合は NULL になります。呼び出し元は、使用が終わったらこのインターフェースを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。

発生し得るエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

IWMDMStorage2::GetStorage はワイルドカード文字をサポートしません。また再帰的でもありません。つまり、現在のストレージの直下の子であるストレージしか見つけられません。2 階層以上深いストレージを検索するには、IWMDMDevice3::FindStorage を使用してください。

次の C++ 関数は、ストレージを再帰的に検索します。まず GetStorage で直下の子を検索し、目的のストレージが見つからない場合は、すべての子をループしてフォルダーを再帰的に検索します。


HRESULT myFindStorageRecursively(LPCWSTR storageName, IWMDMStorage* pCurrentStorage, IWMDMStorage** ppFoundStorage)
{
    HRESULT hr = S_OK;

    // まず、ストレージ内のすべてのストレージを手早く確認する。
    // 見つかったら、ここで終了して戻る。
    CComQIPtr<IWMDMStorage2> pStorage2(pCurrentStorage);
    hr = pStorage2->GetStorage(storageName, ppFoundStorage);
    if (*ppFoundStorage != NULL)
        return hr;

    //
    // 見つからなければ、すべての子フォルダーを列挙して掘り下げる。
    //

    // 最初に列挙子を取得する。
    CComPtr<IWMDMEnumStorage> pEnumStorage;
    hr = pCurrentStorage->EnumStorage(&pEnumStorage);
    if (hr != S_OK && pEnumStorage != NULL)
        return hr;

    // 目的の項目が見つかるか、フォルダーがなくなるまですべてのフォルダーを列挙する。
    CComPtr<IWMDMStorage> pThisStorage;
    DWORD numRetrieved = 0;
    DWORD attr = 0;
    while(pEnumStorage->Next(1, &pThisStorage, &numRetrieved) == S_OK)
    {
        pThisStorage->GetAttributes(&attr, NULL);
        if (attr & WMDM_FILE_ATTR_FOLDER)
        {
            hr = myFindStorageRecursively(storageName, pThisStorage, ppFoundStorage);
            if (*ppFoundStorage != NULL)
                return hr;
        }
        pThisStorage.Release();
    }

    return hr;
}
vtbl 13 HRESULT SetAttributes2(DWORD dwAttributes, DWORD dwAttributesEx, WAVEFORMATEX* pFormat, VIDEOINFOHEADER* pVideoFormat)

SetAttributes2 メソッドは、ストレージの拡張属性を設定します。

dwAttributesDWORDinIWMDMStorage::SetAttributes メソッドで定義されている基本属性を指定する DWORD
dwAttributesExDWORDin拡張属性を指定する DWORD。現在、拡張属性は定義されていません。
pFormatWAVEFORMATEX*inoptionalオブジェクトのオーディオ情報を指定する _ WAVEFORMATEX 構造体への省略可能なポインター。ファイルがオーディオでない場合、このパラメーターは無視されます。
pVideoFormatVIDEOINFOHEADER*inoptionalオブジェクトのビデオ情報を指定する _VIDEOINFOHEADER 構造体への省略可能なポインター。ファイルがビデオでない場合、このパラメーターは無視されます。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。

発生し得るエラーコードの詳細な一覧については、Error Codes を参照してください。
vtbl 14 HRESULT GetAttributes2(DWORD* pdwAttributes, DWORD* pdwAttributesEx, WAVEFORMATEX* pAudioFormat, VIDEOINFOHEADER* pVideoFormat)

GetAttributes2 メソッドは、ストレージの拡張属性を取得します。

pdwAttributesDWORD*outIWMDMStorage::GetAttributes メソッドで定義されている 1 つ以上の属性をビットごとの OR で組み合わせた値を指定する DWORD へのポインター。
pdwAttributesExDWORD*out拡張属性を指定する DWORD へのポインター。現在、拡張属性は定義されていません。
pAudioFormatWAVEFORMATEX*inoutoptionalオブジェクトのオーディオ情報を指定する _ WAVEFORMATEX 構造体への省略可能なポインター。ファイルがオーディオでない場合、このパラメーターは無視されます。
pVideoFormatVIDEOINFOHEADER*inoutoptionalオブジェクトのビデオ情報を指定する _ VIDEOINFOHEADER 構造体への省略可能なポインター。ファイルがビデオでない場合、このパラメーターは無視されます。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。

発生し得るエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

属性の評価は、メディアデバイスの内容を公開する際の重要な手順です。デバイスによっては、記憶メディア上でのデータの階層的な格納をサポートしていない場合があります。GetAttributes2 メソッドは、オブジェクトの属性を通じてファイルシステムの構造を調べることで、そのサポート状況と形式を推測するために使用します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IWMDMStorage2 "{1ED5A144-5CD5-4683-9EFF-72CBDB2D9533}"
#usecom global IWMDMStorage2 IID_IWMDMStorage2 "{807B3CE0-357A-11D3-8471-00C04F79DBC0}"
#comfunc global IWMDMStorage2_GetStorage      12 wstr,sptr
#comfunc global IWMDMStorage2_SetAttributes2  13 int,int,var,var
#comfunc global IWMDMStorage2_GetAttributes2  14 var,var,var,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。