ILayoutStorage
COM公式ドキュメント
ILayoutStorage インターフェイスを使用すると、アプリケーションは複合ファイルのレイアウトを最適化し、低速な回線上でも効率的にダウンロードできるようにできます。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
LayoutScript メソッドは、複合ファイル内のストレージ、ストリーム、コントロールを、ダウンロード時にアクセスされる順序に合わせて並べ替えるための明示的な指示を提供します。
| pStorageLayout | StorageLayout* | in | StorageLayout 構造体の配列へのポインター。 |
| nEntries | DWORD | in | StorageLayout 構造体の配列内のエントリ数。 |
| glfInterleavedFlag | DWORD | optional | 将来の使用のために予約されています。 |
戻り値
この関数は、標準の戻り値 E_OUTOFMEMORY、E_UNEXPECTED、E_INVALIDARG、E_FAIL に加えて、次の値をサポートします。
| 戻り値 | 説明 |
|---|---|
| STG_E_INVALIDPOINTER | ストレージレイアウトのポインターが無効です。 |
| STG_E_INVALIDFLAG | glfInterleavedFlag の値が無効です。 |
| STG_E_PATHNOTFOUND | 指定された新しいドキュメントファイル名が無効です。 |
| STG_E_INSUFFICIENTMEMORY | 操作を完了するのに十分なメモリがありません。 |
| STG_E_INVALIDPARAMETER | パラメーターのいずれかが無効です。 |
| STG_E_INUSE | ILayoutStorage が既に監視を行っている間に BeginMonitor メソッドが呼び出されました。 |
解説(Remarks)
明示的なレイアウト指示を提供するために、アプリケーションは ILayoutStorage::LayoutScript を呼び出し、 StorageLayout 構造体の配列を渡します。各構造体は 1 つのストレージまたはストリームのデータブロックを定義し、そのブロックを ILockBytes バイト配列内のどこに書き込むかを指定します。
アプリケーションは、特定の複合ファイルの構造に応じて、スクリプトによるレイアウトと監視を組み合わせることができます。
複合ファイル全体の最適なデータレイアウトのパターンが決定されると、アプリケーションは ILayoutStorage::ReLayoutDocfile を呼び出して、データセクターがアクセスされた順序に合わせて複合ファイルを再構築します。
BeginMonitor メソッドは、読み込み操作の開始時に監視を開始するために使用します。操作が完了したら、アプリケーションは ILayoutStorage::EndMonitor を呼び出す必要があります。
戻り値
このメソッドは、標準の戻り値 E_OUTOFMEMORY、E_UNEXPECTED、E_INVALIDARG、E_FAIL に加えて、次の値をサポートします。
| 戻り値 | 説明 |
|---|---|
| STG_E_INUSE | ILayoutStorage が既に監視を行っている間に BeginMonitor が呼び出されました。 |
解説(Remarks)
通常、アプリケーションは実際の読み込みが始まる前に BeginMonitor を呼び出します。このメソッドが呼び出されると、複合ファイルの実装は、ファイルのストレージやストリームに対して実行されるすべての操作を、目的のアクセスパターンの一部と見なします。その結果として、 ILayoutStorage::LayoutScript を呼び出して明示的に作成したものと同様のレイアウトスクリプトが生成されます。
アプリケーションは通常、埋め込みオブジェクトのアクセスパターンを取得するために監視を使用します。また、監視により、既存のアプリケーションを起動してそのアクセスパターンを監視する汎用的なレイアウトツールも実現できます。
ILayoutStorage::EndMonitor を呼び出すと、監視が終了します。 BeginMonitor と EndMonitor は複数回呼び出すことができます。また、監視は ILayoutStorage::LayoutScript の呼び出しと組み合わせることもできます。
EndMonitor メソッドは、複合ファイルの監視を終了します。この呼び出しの前に ILayoutStorage::BeginMonitor を呼び出しておく必要があります。
戻り値
この関数は、標準の戻り値 E_OUTOFMEMORY、E_UNEXPECTED、E_INVALIDARG、E_FAIL に加えて、CloseHandle のすべての戻り値をサポートします。
解説(Remarks)
EndMonitor の呼び出しの後には、通常 ILayoutStorage::RelayoutDocfile の呼び出しが続きます。これは、監視によって検出されたアクセスパターンを使用して複合ファイルを再構築します。
ReLayoutDocfile メソッドは、監視によって取得した、または明示的なレイアウトスクリプトによって提供されたレイアウトスクリプトを使用して複合ファイルを書き換え、新しい複合ファイルを作成します。
| pwcsNewDfName | LPWSTR | in | 書き換える複合ファイルの名前へのポインター。この名前は有効なファイル名であり、元の複合ファイルの名前とは異なる必要があります。元の複合ファイルは最適化され、新しい pwcsNewDfName に書き込まれます。 |
戻り値
この関数は、標準の戻り値 E_OUTOFMEMORY、E_UNEXPECTED、E_INVALIDARG、E_FAIL に加えて、次の値をサポートします。
| 戻り値 | 説明 |
|---|---|
| STG_E_INVALIDNAME | この関数に渡された名前が有効なファイル名ではありません。 |
| STG_E_UNKNOWN | レイアウト情報が破損しており、処理できません。 |
実装されていません。呼び出された場合は STG_E_UNIMPLEMENTEDFUNCTION を返します。
| pILockBytes | ILockBytes* | in | 複合ファイルを書き換える対象となる、基になるバイト配列オブジェクト上の ILockBytes インターフェイスへのポインター。 |
戻り値
このメソッドは次の値を返します。
| 戻り値 | 説明 |
|---|---|
| このメソッドは実装されていません。 |
解説(Remarks)
実装されている場合は、呼び出し元が指定したバイト配列オブジェクト内の複合ファイルを書き換えます。成功した場合は S_OK を返し、失敗した場合は STG_E_* エラーコードのいずれかを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ILayoutStorage "{0E6D4D90-6738-11CF-9608-00AA00680DB4}" #usecom global ILayoutStorage IID_ILayoutStorage "{}" #comfunc global ILayoutStorage_LayoutScript 3 var,int,int #comfunc global ILayoutStorage_BeginMonitor 4 #comfunc global ILayoutStorage_EndMonitor 5 #comfunc global ILayoutStorage_ReLayoutDocfile 6 wstr #comfunc global ILayoutStorage_ReLayoutDocfileOnILockBytes 7 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ILayoutStorage "{0E6D4D90-6738-11CF-9608-00AA00680DB4}" #usecom global ILayoutStorage IID_ILayoutStorage "{}" #comfunc global ILayoutStorage_LayoutScript 3 sptr,int,int #comfunc global ILayoutStorage_BeginMonitor 4 #comfunc global ILayoutStorage_EndMonitor 5 #comfunc global ILayoutStorage_ReLayoutDocfile 6 wstr #comfunc global ILayoutStorage_ReLayoutDocfileOnILockBytes 7 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。