IAccessibleWindowlessSite
COM公式ドキュメント
Microsoft ActiveX コントロールのサイトは、Microsoft Active Accessibility の実装を備えたウィンドウレス ActiveX コントロールがそのアクセシビリティを表現できるようにするために、このインターフェイスを実装します。
解説(Remarks)
オブジェクト ID 範囲を管理する関数は、サイト オブジェクトが既に予約済みの範囲の一覧を保持していることを前提としています。ActiveX コントロールを含むウィンドウが、予約済みの範囲内にある LPARAM 値(オブジェクト ID)を伴う WM_GETOBJECT メッセージを受け取ったときは、そのウィンドウは IAccessibleHandler::AccessibleObjectFromID メソッドを呼び出して、そのオブジェクト ID に対応する IAccessible オブジェクトを取得する必要があります。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コントロール ホストからオブジェクト ID の範囲を取得し、特定のウィンドウレス コントロールによって予約済みであることを示すマークを付けます。
| rangeSize | INT | in | 要求するオブジェクト ID 範囲のサイズ。 |
| pRangeOwner | IAccessibleHandler* | in | 範囲を要求しているウィンドウレス コントロール。 |
| pRangeBase | INT* | out | 取得された範囲内の最初のオブジェクト ID。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラー コードを返します。
解説(Remarks)
別のウィンドウレス コントロールに属するオブジェクト ID を使用してしまわないように、コントロールは NotifyWinEvent 関数を呼び出す前にオブジェクト ID 範囲を取得しておく必要があります。コントロールは、含まれるすべてのアクセシブル オブジェクト分のオブジェクト ID を十分に確保する必要があります。たとえば、100 個の子を持つツリー コントロールであれば、ルート用に 1 つ、各子用に 1 つずつ、少なくとも 101 個のオブジェクト ID を予約します。今後増加が見込まれるツリー コントロールであれば、予想される分だけ多くのオブジェクト ID を予約します。数百個の子まで増加すると見込まれる場合は、念のため 1000 個の ID 範囲を予約するとよいでしょう。
Microsoft ActiveX コントロールを含むウィンドウが、予約済みの範囲内にある LPARAM 値(オブジェクト ID)を伴う WM_GETOBJECT メッセージを受け取ったときは、IAccessibleHandler::AccessibleObjectFromID メソッドを呼び出して、そのオブジェクト ID に対応する IAccessible オブジェクトを取得する必要があります。
直前の IAccessibleWindowlessSite::AcquireObjectIdRange メソッドの呼び出しによって取得されたオブジェクト ID 範囲を解放します。
| rangeBase | INT | in | 解放する ID 範囲内の最初のオブジェクト ID。 |
| pRangeOwner | IAccessibleHandler* | in | 範囲が取得されたときにそれが関連付けられていたウィンドウレス ActiveX コントロール。 |
戻り値
解説(Remarks)
オブジェクト範囲を解放する際の誤りを防ぐため、システムは pControl パラメーターを使用して、解放されるオブジェクト ID の範囲が実際に指定されたウィンドウレス コントロールに属していることを確認します。
特定のウィンドウレス Microsoft ActiveX コントロールが予約しているオブジェクト ID 範囲を取得します。
| pRangesOwner | IAccessibleHandler* | in | 範囲を照会する対象のコントロール。 |
| psaRanges | SAFEARRAY** | out | オブジェクト ID 範囲の配列を受け取ります。この配列には整数のペアの集合が格納されます。各ペアについて、1 つ目の整数はその範囲内の最初のオブジェクト ID、2 つ目の整数はその範囲に含まれるオブジェクト ID の個数です。 |
戻り値
アクセシビリティ ツリーにおける、ウィンドウレス Microsoft ActiveX コントロールの親の IAccessible ポインターを取得します。
| ppParent | IAccessible** | out | ウィンドウレス ActiveX コントロールの親の IAccessible ポインターを受け取ります。 |
戻り値
解説(Remarks)
親の IAccessible オブジェクトを返すには、IAccessible を実装するオブジェクトが get_accParent メソッドを実装できる必要があります。ウィンドウレス ActiveX コントロールは、アクセシブル ツリー内における親オブジェクトの中での自分の位置を特定できない場合があるため、get_accParent の実装は困難です。GetParentAccessible メソッドを使用すると、ウィンドウレス ActiveX コントロールは自身のサイトに親オブジェクトを照会し、その親オブジェクトを get_accParent を呼び出したクライアントに返すことができます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAccessibleWindowlessSite "{BF3ABD9C-76DA-4389-9EB6-1427D25ABAB7}" #usecom global IAccessibleWindowlessSite IID_IAccessibleWindowlessSite "{}" #comfunc global IAccessibleWindowlessSite_AcquireObjectIdRange 3 int,sptr,var #comfunc global IAccessibleWindowlessSite_ReleaseObjectIdRange 4 int,sptr #comfunc global IAccessibleWindowlessSite_QueryObjectIdRanges 5 sptr,var #comfunc global IAccessibleWindowlessSite_GetParentAccessible 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAccessibleWindowlessSite "{BF3ABD9C-76DA-4389-9EB6-1427D25ABAB7}" #usecom global IAccessibleWindowlessSite IID_IAccessibleWindowlessSite "{}" #comfunc global IAccessibleWindowlessSite_AcquireObjectIdRange 3 int,sptr,sptr #comfunc global IAccessibleWindowlessSite_ReleaseObjectIdRange 4 int,sptr #comfunc global IAccessibleWindowlessSite_QueryObjectIdRanges 5 sptr,sptr #comfunc global IAccessibleWindowlessSite_GetParentAccessible 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。