IMDSPObject
COM公式ドキュメント
IMDSPObject インターフェースは、記憶メディアとの間のデータ転送を管理します。Open、Read、Write、Close の各メソッドは、ストレージオブジェクトがファイルである場合にのみ有効です。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Open メソッドは、関連付けられたオブジェクトを開き、Read 操作または Write 操作に備えます。この操作は、ストレージオブジェクトがファイルを表す場合にのみ有効です。
| fuMode | DWORD | in | ファイルを開くモード。次の 2 つの値のいずれかである必要があります。
|
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
基盤となるファイルシステムが複数のファイルを同時に開くことをサポートしていない場合、クライアントが一度に複数のファイルを開こうとしたときには、サービスプロバイダーは Win32 エラーコード ERROR_TOO_MANY_OPEN_FILES を適切に返す必要があります。
このメソッドは実装する必要があります。WMDM_E_NOTSUPPORTED または E_NOTIMPL を返してはなりません。詳細については、Mandatory and Optional Interfaces を参照してください。
Read メソッドは、現在の位置からオブジェクトのデータを読み取ります。この操作は、ストレージオブジェクトがファイルを表す場合にのみ有効です。
| pData | BYTE* | out | オブジェクトから読み取ったデータを受け取るバッファーへのポインター。このパラメーターは出力メッセージ認証コードに含められ、CSecureChannelServer::EncryptParam を使用して暗号化する必要があります。「解説」を参照してください。 |
| pdwSize | DWORD* | inout | 読み取るデータのバイト数を指定する DWORD へのポインター。戻り時には、このパラメーターに実際に読み取られたデータ量が格納されます。このパラメーターは入力メッセージ認証コードに含める必要があります。 |
| abMac | BYTE* | inout | このメソッドのパラメーターデータに対するメッセージ認証コードを格納する 8 バイトの配列。(WMDM_MAC_LENGTH は 8 として定義されています。) |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
暗号化に使用する MAC では、CSecureChannelServer::MACUpdate の呼び出しに pData と pdwSize の両方を含める必要があります。
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
Write メソッドは、オブジェクト内の現在の位置にデータを書き込みます。この操作は、ストレージオブジェクトがファイルを表す場合にのみ有効です。
| pData | BYTE* | in | オブジェクトに書き込むデータを格納したバッファーへのポインター。このパラメーターは暗号化されており、abMac に格納された MAC を使用して CSecureChannelServer::DecryptParam で復号する必要があります。「解説」を参照してください。 |
| pdwSize | DWORD* | inout | 書き込むデータのバイト数を格納する DWORD。戻り時には、このパラメーターに実際に書き込まれたバイト数が格納されます。このパラメーターは入力と出力の両方のメッセージ認証コードに含める必要があります。 |
| abMac | BYTE* | inout | このメソッドのパラメーターデータに対するメッセージ認証コードを格納する 8 バイトの配列。(WMDM_MAC_LENGTH は 8 として定義されています。) |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
暗号化に使用する MAC では、CSecureChannelServer::MACUpdate の呼び出しに pData と pdwSize の両方を含める必要があります。
このメソッドは実装する必要があります。WMDM_E_NOTSUPPORTED または E_NOTIMPL を返してはなりません。詳細については、Mandatory and Optional Interfaces を参照してください。
Delete メソッドは、メディアデバイスの記憶メディアから 1 つまたは複数のオブジェクトを削除します。
| fuMode | DWORD | in | クライアントが常に WMDM_MODE_RECURSIVE に設定する必要があるフラグ。オブジェクトがフォルダーの場合は、そのフォルダーとその内容、およびすべてのサブフォルダーとその内容が削除されます。オブジェクトがファイルの場合、このパラメーターは無視されます。 |
| pProgress | IWMDMProgress* | inoptional | アプリケーションが実装した IWMDMProgress インターフェースへのポインター。これにより、時間のかかる Delete 操作の進行状況通知をアプリケーションが受け取れるようになります。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
このメソッドは、記憶メディアからオブジェクトを完全に削除します。
Windows Media Device Manager のサービスプロバイダーで CompactFlash カードリーダー/ライターを使用している場合、IMDSPObject::Write の直後に IMDSPObject::Delete を呼び出すと失敗することがあります。これは、CompactFlash リーダー/ライターに書き込まれたデータが、カードリーダー/ライターのドライバーによってバッファリングされるためです。サービスプロバイダーは書き込み操作が完了したかのように応答しますが、ドライバーは独自のスケジュールに従ってデバイスへデータを書き出します。ドライバーが書き込み操作を完了していない場合、IMDSPObject::Delete は失敗します。
このメソッドは実装する必要があります。WMDM_E_NOTSUPPORTED または E_NOTIMPL を返してはなりません。詳細については、Mandatory and Optional Interfaces を参照してください。
Seek メソッドは、オブジェクト内の現在の位置を設定します。この操作は、ストレージオブジェクトがファイルを表す場合にのみ有効です。
| fuFlags | DWORD | in | ファイルを開くモード。次の表に示す値のいずれかである必要があります。
| ||||||||
| dwOffset | DWORD | in | シークするバイト数を格納する DWORD。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
Rename メソッドは、関連付けられたオブジェクト (ファイルまたはフォルダー) の名前を変更します。
| pwszNewName | LPWSTR | in | オブジェクトの新しい名前を受け取る、null で終わるワイド文字列へのポインター。LPWSTR 変数型の使用方法については、Windows のドキュメントを参照してください。 |
| pProgress | IWMDMProgress* | inoptional | アプリケーションが実装した IWMDMProgress インターフェースへのポインター。これにより、時間のかかる名前変更操作の進行状況通知をアプリケーションが受け取れるようになります。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
Move メソッドは、メディアデバイス上のファイルまたはフォルダーを移動します。
| fuMode | DWORD | in | Move 操作を呼び出す処理モードと、移動の方法。次の 2 つのモードのうち、いずれか 1 つだけを指定します。両方のモードを指定した場合は、ブロックモードが使用されます。
次の表は、オブジェクトの移動先を示すフラグの一覧です。この表の値 1 つと、前述のモードの表の値 1 つを、ビットごとの OR で組み合わせます。
| ||||||||||||||
| pProgress | IWMDMProgress* | inoptional | 進行中の操作の進行状況を追跡するためにアプリケーションが実装した IWMDMProgress インターフェースへのポインター。このパラメーターは省略可能であり、使用しない場合は NULL に設定します。 | ||||||||||||||
| pTarget | IMDSPStorage* | inoptional | 現在のオブジェクトを前または後に配置する対象となる、ターゲットオブジェクトへのポインター。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
ファイルまたはディレクトリは、同一のルートストレージ内でのみ移動できます。このメソッドを呼び出したオブジェクトは、新しい位置を反映するように更新する必要があります。
このメソッドは省略可能です。詳細については、Mandatory and Optional Interfaces を参照してください。
Close メソッドは、メディアデバイスの記憶メディア上のファイルを閉じます。
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次に示すいずれかの分類のエラーコードを返す可能性があります。
- 標準的な COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
このメソッドは実装する必要があります。WMDM_E_NOTSUPPORTED または E_NOTIMPL を返してはなりません。詳細については、Mandatory and Optional Interfaces を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMDSPObject "{1DCB3A18-33ED-11D3-8470-00C04F79DBC0}" #usecom global IMDSPObject IID_IMDSPObject "{}" #comfunc global IMDSPObject_Open 3 int #comfunc global IMDSPObject_Read 4 var,var,var #comfunc global IMDSPObject_Write 5 var,var,var #comfunc global IMDSPObject_Delete 6 int,sptr #comfunc global IMDSPObject_Seek 7 int,int #comfunc global IMDSPObject_Rename 8 wstr,sptr #comfunc global IMDSPObject_Move 9 int,sptr,sptr #comfunc global IMDSPObject_Close 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMDSPObject "{1DCB3A18-33ED-11D3-8470-00C04F79DBC0}" #usecom global IMDSPObject IID_IMDSPObject "{}" #comfunc global IMDSPObject_Open 3 int #comfunc global IMDSPObject_Read 4 sptr,sptr,sptr #comfunc global IMDSPObject_Write 5 sptr,sptr,sptr #comfunc global IMDSPObject_Delete 6 int,sptr #comfunc global IMDSPObject_Seek 7 int,int #comfunc global IMDSPObject_Rename 8 wstr,sptr #comfunc global IMDSPObject_Move 9 int,sptr,sptr #comfunc global IMDSPObject_Close 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。