IWMDMStorage2
COM公式ドキュメント
IWMDMStorage2 インターフェースは IWMDMStorage を拡張し、名前を指定して子ストレージを取得したり、拡張属性を取得・設定したりできるようにします。IWMDMStorage3 インターフェースは、メタデータをサポートすることでこのインターフェースを拡張します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetStorage メソッドは、すべての子を列挙することなく、現在のストレージから名前を指定して子ストレージを直接取得します。
| pszStorageName | LPWSTR | in | ストレージ名を指定する null 終端文字列へのポインター。これは IWMDMStorage::GetName で取得される名前です。 |
| ppStorage | IWMDMStorage** | out | 取得されたストレージオブジェクトへのポインター。ストレージが見つからなかった場合は NULL になります。呼び出し元は、使用が終わったらこのインターフェースを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(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;
}
SetAttributes2 メソッドは、ストレージの拡張属性を設定します。
| dwAttributes | DWORD | in | IWMDMStorage::SetAttributes メソッドで定義されている基本属性を指定する DWORD。 |
| dwAttributesEx | DWORD | in | 拡張属性を指定する DWORD。現在、拡張属性は定義されていません。 |
| pFormat | WAVEFORMATEX* | inoptional | オブジェクトのオーディオ情報を指定する _ WAVEFORMATEX 構造体への省略可能なポインター。ファイルがオーディオでない場合、このパラメーターは無視されます。 |
| pVideoFormat | VIDEOINFOHEADER* | inoptional | オブジェクトのビデオ情報を指定する _VIDEOINFOHEADER 構造体への省略可能なポインター。ファイルがビデオでない場合、このパラメーターは無視されます。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
GetAttributes2 メソッドは、ストレージの拡張属性を取得します。
| pdwAttributes | DWORD* | out | IWMDMStorage::GetAttributes メソッドで定義されている 1 つ以上の属性をビットごとの OR で組み合わせた値を指定する DWORD へのポインター。 |
| pdwAttributesEx | DWORD* | out | 拡張属性を指定する DWORD へのポインター。現在、拡張属性は定義されていません。 |
| pAudioFormat | WAVEFORMATEX* | inoutoptional | オブジェクトのオーディオ情報を指定する _ WAVEFORMATEX 構造体への省略可能なポインター。ファイルがオーディオでない場合、このパラメーターは無視されます。 |
| pVideoFormat | VIDEOINFOHEADER* | inoutoptional | オブジェクトのビデオ情報を指定する _ VIDEOINFOHEADER 構造体への省略可能なポインター。ファイルがビデオでない場合、このパラメーターは無視されます。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次のいずれかの種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
属性の評価は、メディアデバイスの内容を公開する際の重要な手順です。デバイスによっては、記憶メディア上でのデータの階層的な格納をサポートしていない場合があります。GetAttributes2 メソッドは、オブジェクトの属性を通じてファイルシステムの構造を調べることで、そのサポート状況と形式を推測するために使用します。
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 指定が可能。#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,sptr,sptr #comfunc global IWMDMStorage2_GetAttributes2 14 sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。