IMDSPDevice2
COM公式ドキュメント
IMDSPDevice2 インターフェイスは IMDSPDevice を拡張し、拡張フォーマットの取得、プラグ アンド プレイ (PnP) デバイス名の取得、プロパティ ページの使用の有効化、および名前から記憶域メディアへのポインターを取得する機能を提供します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetStorage メソッドは、すべてのストレージを列挙して探すのではなく、名前を指定して直接ストレージにアクセスできるようにします。
| pszStorageName | LPWSTR | in | 検索するストレージの名前を含む、null 終端文字列へのポインター。 |
| ppStorage | IMDSPStorage** | out | pszStorageName パラメーターで指定されたストレージ オブジェクトへのポインター。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次のいずれかの分類のエラー コードを返す可能性があります。
- 標準的な COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
解説(Remarks)
GetStorage メソッドはワイルドカード文字をサポートしません。また再帰的ではなく、デバイスのルートにあるストレージのみを検索します。
このメソッドを実装しない場合は、E_NOTIMPL を返してください (WMDM_E_NOT_SUPPORTED や、このメソッドが実装されていないことを示すその他のコードを返さないでください)。これにより、Windows Media Device Manager は、pszStorageName として渡されたストレージ名に一致するものをすべてのストレージを列挙して検索することで、この機能を自ら代替しようとします。
サービス プロバイダーは、名前に基づいてストレージ オブジェクトを効率的に返せるよう、このメソッドを実装することを強く推奨します。
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
GetFormatSupport2 メソッドは、オーディオ コーデックやビデオ コーデック、MIME ファイル形式を含む、デバイスがサポートするフォーマットを取得します。
| dwFlags | DWORD | in | オーディオ形式、ビデオ形式、および MIME タイプを示す DWORD。このフラグは、アプリケーションがサービス プロバイダーに設定を要求する内容を指定します。呼び出し元は、次の 3 つの値のうち 1 つ以上を設定できます。
| ||||||||
| ppAudioFormatEx | WAVEFORMATEX** | out | デバイスがサポートするオーディオ コーデックとビット レートに関する情報を含む _WAVEFORMATEX 構造体の配列へのポインター。 | ||||||||
| pnAudioFormatCount | DWORD* | out | オーディオ形式の数を格納する整数へのポインター。 | ||||||||
| ppVideoFormatEx | VIDEOINFOHEADER** | out | デバイスがサポートするビデオ コーデックと形式に関する情報を含む _VIDEOINFOHEADER 構造体の配列へのポインター。 | ||||||||
| pnVideoFormatCount | DWORD* | out | ビデオ形式の数を格納する整数へのポインター。 | ||||||||
| ppFileType | WMFILECAPABILITIES** | out | デバイスがサポートするファイルの種類に関する情報を含む WMFILECAPABILITIES 構造体の配列へのポインター。 | ||||||||
| pnFileTypeCount | DWORD* | out | ファイル形式の数を格納する整数へのポインター。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次のいずれかの分類のエラー コードを返す可能性があります。
- 標準的な COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
解説(Remarks)
このメソッドは必ず実装する必要があります。WMDM_E_NOTSUPPORTED や E_NOTIMPL を返してはいけません。詳細については、Mandatory and Optional Interfaces を参照してください。
GetSpecifyPropertyPages メソッドは、ポータブル デバイスの非標準的な機能を説明するプロパティ ページを取得します。
| ppSpecifyPropPages | ISpecifyPropertyPages** | out | Win32 の ISpecifyPropertyPages インターフェイス ポインターへのポインター。 |
| pppUnknowns | IUnknown*** | out | IUnknown インターフェイス ポインターの配列。これらのインターフェイスはプロパティ ページに渡され、プロパティ ページとサービス プロバイダーの間で情報をやり取りするために使用できます。 |
| pcUnks | DWORD* | out | pppUnknowns 配列のサイズ。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次のいずれかの分類のエラー コードを返す可能性があります。
- 標準的な COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
解説(Remarks)
pppUnknowns 配列のメモリはこのメソッドで割り当てる必要があり、呼び出し元が標準的な Win32 関数である CoTaskMemFree を使用して解放する必要があります。
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
GetCanonicalPName メソッドは、デバイスの正規名を取得します。
| pwszPnPName | LPWSTR | out | 正規名を格納するワイド文字の null 終端バッファー。このバッファーの割り当てと解放は呼び出し元が行います。 |
| nMaxChars | DWORD | in | 終端文字を含めて、pwszCanonicalName に格納できる最大文字数を示す整数。 |
戻り値
このメソッドは HRESULT を返します。返される値には、次の表に示すものが含まれますが、これらに限定されません。
解説(Remarks)
このメソッドは、デバイスの正規名を返します。サービス プロバイダーは、デバイスのデバイス パス名を正規名として返す必要があります。デバイス パス名は、IMDServiceProvider2 インターフェイスの CreateDevice メソッドでサービス プロバイダーに渡されます。
これは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMDSPDevice2 "{420D16AD-C97D-4E00-82AA-00E9F4335DDD}" #usecom global IMDSPDevice2 IID_IMDSPDevice2 "{}" #comfunc global IMDSPDevice2_GetStorage 14 wstr,sptr #comfunc global IMDSPDevice2_GetFormatSupport2 15 int,var,var,var,var,var,var #comfunc global IMDSPDevice2_GetSpecifyPropertyPages 16 sptr,sptr,var #comfunc global IMDSPDevice2_GetCanonicalName 17 var,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMDSPDevice2 "{420D16AD-C97D-4E00-82AA-00E9F4335DDD}" #usecom global IMDSPDevice2 IID_IMDSPDevice2 "{}" #comfunc global IMDSPDevice2_GetStorage 14 wstr,sptr #comfunc global IMDSPDevice2_GetFormatSupport2 15 int,sptr,sptr,sptr,sptr,sptr,sptr #comfunc global IMDSPDevice2_GetSpecifyPropertyPages 16 sptr,sptr,sptr #comfunc global IMDSPDevice2_GetCanonicalName 17 sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。