IStreamAsync
COM公式ドキュメント
非同期ストリームに対する入出力(I/O)を管理するためのメソッドを公開します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ストリームから情報を非同期に読み取ります。たとえば、Shell はファイル項目を非同期に転送する際にこのインターフェイスを実装します。
| pv | void* | out | このメソッドが正常に終了すると、長さが cb バイトで、読み取り操作から得られた pcbRead バイトの情報を含むバッファーを返します。 |
| cb | DWORD | in | ストリームから読み取るバイト数です。 |
| pcbRead | DWORD* | outoptional | DWORD 値へのポインターで、このメソッドが正常に終了すると、pv が指すバッファーに実際に読み取られたバイト数を格納します。この値は NULL にできます。 |
| lpOverlapped | OVERLAPPED* | in | 非同期読み取り操作で使用される情報を含む OVERLAPPED 構造体へのポインターです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IStreamAsync::ReadAsync は、入出力(I/O)操作を開始する際に、OVERLAPPED 構造体の hEvent メンバーで指定されたイベントを非シグナル状態にリセットする必要があります。
このメソッドは、パブリックな ReadFile API を薄くラップする形で Shell に実装されています。
ストリームに情報を非同期に書き込みます。たとえば、Shell はファイル項目を非同期に転送する際にこのメソッドを実装します。
| lpBuffer | void* | in | ストリームに書き込む情報を含む、サイズ cb バイトのバッファーへのポインターです。 |
| cb | DWORD | in | lpBuffer が指すバッファーのサイズ(バイト単位)です。 |
| pcbWritten | DWORD* | outoptional | DWORD 値へのポインターで、このメソッドが正常に終了すると、ストリームに実際に書き込まれたバイト数を格納します。この情報が不要な場合、この値は NULL にできます。 |
| lpOverlapped | OVERLAPPED* | in | 非同期書き込み操作で使用される情報を含む OVERLAPPED 構造体へのポインターです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
WriteAsync は、入出力(I/O)操作を開始する際に、OVERLAPPED 構造体の hEvent メンバーで指定されたイベントを非シグナル状態にリセットする必要があります。
オーバーラップ操作の結果を取得します。
| lpOverlapped | OVERLAPPED* | in | オーバーラップ操作を開始したときに指定された OVERLAPPED 構造体へのポインターです。 |
| lpNumberOfBytesTransferred | DWORD* | out | このメソッドが返るとき、読み取りまたは書き込み操作によって実際に転送されたバイト数を格納します。 |
| bWait | BOOL | in | TRUE の場合、操作が完了するまでメソッドは返りません。FALSE で操作が保留中の場合、メソッドは ERROR_IO_INCOMPLETE に相当する HRESULT を返します。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
保留中のすべての入出力(I/O)操作をキャンセル済みとしてマークします。
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IStreamAsync "{FE0B6665-E0CA-49B9-A178-2B5CB48D92A5}" #usecom global IStreamAsync IID_IStreamAsync "{}" #comfunc global IStreamAsync_ReadAsync 14 sptr,int,var,var #comfunc global IStreamAsync_WriteAsync 15 sptr,int,var,var #comfunc global IStreamAsync_OverlappedResult 16 var,var,int #comfunc global IStreamAsync_CancelIo 17 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IStreamAsync "{FE0B6665-E0CA-49B9-A178-2B5CB48D92A5}" #usecom global IStreamAsync IID_IStreamAsync "{}" #comfunc global IStreamAsync_ReadAsync 14 sptr,int,sptr,sptr #comfunc global IStreamAsync_WriteAsync 15 sptr,int,sptr,sptr #comfunc global IStreamAsync_OverlappedResult 16 sptr,sptr,int #comfunc global IStreamAsync_CancelIo 17 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。