次の方法で共有


In-Contextフック機能に関する注意事項

パフォーマンス上の理由から、クライアント開発者はコンテキスト内フック関数を登録します。 ただし、これらのフック関数はサーバーのアドレス空間にマップされるため、クライアントとサーバーの開発者は、イベント処理がスムーズに行われるように予防措置を講じる必要があります。

クライアント開発者向けの注意事項

クライアント開発者は、次の問題に注意する必要があります。

  • コンテキスト内フック関数では、サーバー アプリケーションが続行する前にフック関数がを返す必要があるため、プロセッサ時間をあまり使用しないでください。
  • イベントがトリガーされた後、フック関数が呼び出されるまでに、イベントに関連付けられているウィンドウが存在しなくなった可能性があります。 クライアントは、イベントに関連する他のアクションを実行する前に、イベントに関連付けられているウィンドウがまだ存在することを確認する必要があります。 ウィンドウがまだ存在することを確認するために、クライアントは Microsoft Win32 IsWindow 関数を 使用します。
  • フック関数が定義されている DLL が別の DLL にリンクされている場合、クライアント開発者は、システムが他の DLL を読み込む必要があります。 暗黙的にリンクする場合 (.def ファイルとインポートを使用)、追加の DLL は、Windows ディレクトリ、または Windows\System、Windows\System32、Windows\SysWOW64 などのシステム ディレクトリのいずれかに存在する必要があります。 ( LoadLibrary を使用して) 明示的にリンクする場合は、 LoadLibrary の呼び出しで、追加の DLL が存在するディレクトリへの完全なパスを指定する必要があります。
  • コンテキスト内フック関数は、フック関数を含む DLL が 16 ビット アプリケーションに読み込まれると、スタック オーバーフローを引き起こす可能性があります。 この問題は、16 ビット アプリケーションが固定スタック サイズを使用しているために発生します。これは、フック関数を呼び出すシステム関数呼び出しのチェーンに対応するのに十分な大きさではありません。

サーバー開発者向けの注意事項

サーバー開発者は、クライアント アプリケーションがコンテキスト内フック関数を登録する可能性があることに注意する必要があります。 サーバーが NotifyWinEvent を呼び出すときは、 WM_GETOBJECT およびその他の IAccessible メソッドを処理するように準備する必要があります。

インターフェイス ポインターが無効です

クライアントがコンテキスト内フック関数内で AccessibleObjectFromEvent を呼び出すと、返される IAccessible インターフェイス ポインターは、サーバーのアドレス空間内のコードを直接指します。 クライアントがこのポインターを使用してインターフェイス プロパティを呼び出した場合、コンポーネント オブジェクト モデル (COM) ライブラリはマーシャリング (プロセス境界を越えたインターフェイス パラメーターのパッケージ化と送信) やマーシャリング解除 (プロセス境界を越えて送信されたパラメーターのアンパック) には関係せず、オブジェクトが破棄されたかどうかを検出しません。

クライアントが破棄されたオブジェクトに対してインターフェイス プロパティを呼び出すと、無効なインターフェイス ポインターにより、サーバーがこの状況を検出しない限り、サーバーのアドレス空間に一般保護エラーが発生します。

無効なインターフェイス ポインターから保護するために、サーバーは、アクセス可能なオブジェクトをラップし、アクセス可能なオブジェクトの有効期間を監視するプロキシ オブジェクトを 作成 します。 たとえば、クライアントが IAccessible プロパティを呼び出してオブジェクトに関する情報を取得すると、プロキシはアクセス可能なオブジェクトがまだ使用可能かどうかを確認し、その場合はクライアントの要求をアクセス可能なオブジェクトに転送します。 アクセス可能なオブジェクトが破棄された場合、プロキシはクライアントにエラーを返します。