IStreamBufferInitialize
COM公式ドキュメント
IStreamBufferInitialize インターフェイスは、stream buffer フィルターを構成するために使用します。Stream Buffer Source フィルター、Stream Buffer Sink フィルター、および StreamBufferConfig オブジェクトはいずれもこのインターフェイスを公開します。
解説(Remarks)
このインターフェイスのインターフェイス識別子 (IID) を宣言するには、__uuidof 演算子を使用します: __uuidof(IStreamBufferInitialize)。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetHKEY メソッドは、stream buffer オブジェクトが構成情報を格納するレジストリキーを設定します。
| hkeyRoot | HKEY | in | レジストリキーへのハンドル。 |
戻り値
HRESULT を返します。取り得る値には次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| SetHKEY が、フィルターの内部初期化後に呼び出されました。 |
解説(Remarks)
このメソッドを使用すると、アプリケーションは stream buffer オブジェクトが構成情報 (バッキングファイルの場所、バッキングファイルの数、およびそのサイズを含む) を保存するレジストリキーを指定できます。
このメソッドは、オブジェクトが明示的または暗黙的に初期化される前に呼び出す必要があります。Stream Buffer Sink フィルターの場合は、プロファイルがロックされる前にメソッドを呼び出します。Stream Buffer Source フィルターの場合は、ソースファイル名を設定する前にメソッドを呼び出します。
このメソッドを使用するには、次の手順を実行します。
- 新しいレジストリキーを作成するか、既存のキーを開きます。
- StreamBufferConfig オブジェクトのインスタンスを作成します。
- StreamBufferConfig オブジェクトに対して IStreamBufferInitialize インターフェイスをクエリします。
- レジストリキーへのハンドルを指定して、StreamBufferConfig オブジェクトに対して SetHKey を呼び出します。
- 必要に応じて、IStreamBufferConfigure メソッドを呼び出して、レジストリキーに格納される構成情報を変更します。
- 同じレジストリキーを使用して、Stream Buffer Source フィルターと Stream Buffer Sink フィルターに対して SetHKey を呼び出します。
呼び出し側は、このメソッドを呼び出した後にレジストリキーハンドルを解放してかまいません。
例
次のコードは、バッキングファイルのディレクトリを構成する方法を示します。簡潔にするため、エラーチェックは省略しています。
// Create the StreamBufferConfig object.
CComPtr<IStreamBufferConfigure> pConfig;
hr = pConfig.CoCreateInstance(CLSID_StreamBufferConfig);
// Create a new registry key to hold our settings.
HKEY hkey = 0;
long lRes = RegCreateKey(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\MyStreamBufferKey"), &hkey);
// Set the registry key.
CComPtr<IStreamBufferInitialize> pInit;
hr = pConfig.QueryInterface(&pInit);
hr = pInit->SetHKEY(hkey);
pInit.Release();
// Set the backing file directory.
hr = pConfig->SetDirectory(L"C:\\MyDirectory");
// Create the Stream Buffer Sink filter and set the registry key.
CComPtr<IStreamBufferSink> pSink;
hr = pSink.CoCreateInstance(CLSID_StreamBufferSink);
hr = pSink.QueryInterface(&pInit);
hr = pInit->SetHKEY(hkey);
pInit.Release();
// Create the Stream Buffer Source filter and set the registry key.
CComPtr<IStreamBufferSource> pSource;
hr = pSource.CoCreateInstance(CLSID_StreamBufferSource);
hr = pSource.QueryInterface(&pInit);
hr = pInit->SetHKEY(hkey);
SetSIDs メソッドは、バッキングファイルへのアクセスを保護するために使用されるセキュリティ識別子 (SID) を設定します。
| cSIDs | DWORD | in | ppSID パラメーターで指定される配列のサイズを指定します。 |
| ppSID | PSID* | inout | サイズが cSIDs の SID 構造体の配列へのポインター。 |
戻り値
HRESULT を返します。取り得る値には次の表に示すものが含まれます。
| 戻り値 | 説明 |
|---|---|
| 無効な引数です。 | |
| Null ポインター引数です。 | |
| メソッドは成功しました。 |
解説(Remarks)
実行時に、Stream Buffer Source フィルターと Sink フィルターは、バッキングファイルへのアクセスがスレッド間で同期されるように、ミューテックスなどのさまざまな Win32 オブジェクトを作成します。各フィルターは、これらのオブジェクトを保護するために使用される SID のリストを保持しています。既定では、フィルターはホストプロセスから SID を継承します。アプリケーションは SetSIDs メソッドを使用して、既定の SID を上書きできます。
このメソッドを呼び出す場合は、sink フィルターをロックする前、またはソースフィルターでファイルを読み込む前に呼び出してください。すべてのフィルターに同じ SID を与えることをお勧めします。
-
重要 権限の低い SID を設定すると、セキュリティ上の問題が生じる可能性があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IStreamBufferInitialize "{9CE50F2D-6BA7-40FB-A034-50B1A674EC78}"
#usecom global IStreamBufferInitialize IID_IStreamBufferInitialize "{}"
#comfunc global IStreamBufferInitialize_SetHKEY 3 sptr
#comfunc global IStreamBufferInitialize_SetSIDs 4 int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。