IOpLockStatus
COM公式ドキュメント
Microsoft Windows Desktop Search (WDS) がインデックス作成中にアイテムに対して使用する便宜的ロック (opportunistic lock) を確認するためのメソッドを提供します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
インデックス作成対象のアイテムに対する便宜的ロック (OpLock) の状態を確認します。(IOpLockStatus.IsOplockValid)
| pfIsOplockValid | BOOL* | out | OpLock が正常に取得されたかどうかを示す BOOL 値へのポインターを受け取ります。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
OpLock は便宜的ロックであり、他のプロセスがアイテムにアクセスしていないときに、インデクサーがそのアイテムをロックできるようにするものです。他のプロセスが互換性のないアクセスモードを要求した場合、インデクサーはアイテムを解放し、ロックは無効化 (ブレーク) されます。これにより、インデクサーはバックグラウンドで実行され、他のプロセスによるこれらのアイテムへのアクセスを妨げません。
OpLock は、基になる IUrlAccessor オブジェクトの初期化後に取得されることはありません。そのため、同じオブジェクトに対してこのメソッドを呼び出すと、常に同じ出力値が得られます。
インデックス作成対象のアイテムに対する便宜的ロック (OpLock) の状態を確認します。(IOpLockStatus.IsOplockBroken)
| pfIsOplockBroken | BOOL* | out | OpLock がブレークされたかどうかを示す BOOL 値へのポインターを受け取ります。OpLock が取得された後にブレークされた場合は TRUE、それ以外の場合 (OpLock が取得されなかった場合を含む) は FALSE です。 |
戻り値
解説(Remarks)
OpLock は便宜的ロックであり、他のプロセスがアイテムにアクセスしていないときに、インデクサーがそのアイテムをロックできるようにするものです。他のプロセスが互換性のないアクセスモードを要求した場合、インデクサーはアイテムを解放し、ロックは無効化 (ブレーク) されます。これにより、インデクサーはバックグラウンドで実行され、他のプロセスによるこれらのアイテムへのアクセスを妨げません。
便宜的ロック (OpLock) のイベントハンドルを取得します。OpLock がブレークされるとイベントオブジェクトはシグナル状態に設定され、インデクサーは基になる IUrlAccessor オブジェクトに対するすべての操作を停止できます。
| phOplockEv | HANDLE* | out | OpLock に関連付けられたイベントのハンドルへのポインターを受け取ります。OpLock が取得されていない場合は NULL になります。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOpLockStatus "{C731065D-AC80-11D1-8DF3-00C04FB6EF4F}" #usecom global IOpLockStatus IID_IOpLockStatus "{}" #comfunc global IOpLockStatus_IsOplockValid 3 var #comfunc global IOpLockStatus_IsOplockBroken 4 var #comfunc global IOpLockStatus_GetOplockEventHandle 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IOpLockStatus "{C731065D-AC80-11D1-8DF3-00C04FB6EF4F}" #usecom global IOpLockStatus IID_IOpLockStatus "{}" #comfunc global IOpLockStatus_IsOplockValid 3 sptr #comfunc global IOpLockStatus_IsOplockBroken 4 sptr #comfunc global IOpLockStatus_GetOplockEventHandle 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。