COleMessageFilter クラス

OLE アプリケーション間の相互に要求されるコンカレンシーを管理します。

構文

class COleMessageFilter : public CCmdTarget

メンバー

パブリック コンストラクター

名前 説明
COleMessageFilter::COleMessageFilter COleMessageFilter オブジェクトを構築します。

パブリック メソッド

名前 説明
COleMessageFilter::BeginBusyState アプリケーションをビジー状態にします。
COleMessageFilter::EnableBusyDialog 呼び出されたアプリケーションがビジー状態のときに表示されるダイアログ ボックスを有効または無効にします。
COleMessageFilter::EnableNotRespondingDialog 呼び出されたアプリケーションが応答していない場合に表示されるダイアログ ボックスを有効または無効にします。
COleMessageFilter::EndBusyState アプリケーションのビジー状態を終了します。
COleMessageFilter::OnMessagePending OLE 呼び出しの進行中にメッセージを処理するためにフレームワークによって呼び出されます。
COleMessageFilter::Register OLE システム DLL にメッセージ フィルターを登録します。
COleMessageFilter::Revoke OLE システム DLL に対するメッセージ フィルターの登録を取り消します。
COleMessageFilter::SetBusyReply OLE 呼び出しに対するビジー状態のアプリケーションの応答を決定します。
COleMessageFilter::SetMessagePendingDelay OLE 呼び出しへの応答をアプリケーションが待機する時間を指定します。
COleMessageFilter::SetRetryReply ビジー状態のアプリケーションに対する呼び出し元アプリケーションの応答を決定します。

解説

COleMessageFilter クラスは、ビジュアル編集サーバーおよびコンテナー アプリケーション、および OLE オートメーション アプリケーションで役立ちます。 呼び出されるサーバー アプリケーションの場合、このクラスを使用してアプリケーションを "ビジー" にして、他のコンテナー アプリケーションからの着信呼び出しが取り消されるか、後で再試行されるようにすることができます。 このクラスを使用して、呼び出し元アプリケーションがビジー状態のときに呼び出し元アプリケーションが実行するアクションを決定することもできます。

一般的な使用方法は、サーバー アプリケーションが BeginBusyState および EndBusyState を呼び出す際に、ドキュメントまたはその他の OLE アクセス可能なオブジェクトが破棄されるのが危険な場合です。 これらの呼び出しは、ユーザー インターフェイスの更新中に CWinApp::OnIdle で行われます。

既定では、アプリケーションの初期化時に COleMessageFilter オブジェクトが割り当てられます。 AfxOleGetMessageFilter を使用して取得できます。

これは高度なクラスです。直接操作する必要はほとんどありません。

詳細については、「 Servers: サーバーの実装」を参照してください。

継承階層

CObject

CCmdTarget

COleMessageFilter

要件

ヘッダー: afxole.h

COleMessageFilter::BeginBusyState

この関数を呼び出して、ビジー状態を開始します。

virtual void BeginBusyState();

解説

EndBusyState と組み合わせて動作し、アプリケーションのビジー状態を制御します。 関数 SetBusyReply は、ビジー状態のときに呼び出し元のアプリケーションに対するアプリケーションの応答を決定します。

BeginBusyState呼び出しとEndBusyState呼び出しはそれぞれインクリメントとデクリメントで、アプリケーションがビジーかどうかを判断するカウンターです。 たとえば、 BeginBusyState に対する 2 回の呼び出しと、 EndBusyState への 1 回の呼び出しでは、引き続きビジー状態になります。 ビジー状態を取り消すには、BeginBusyStateが呼び出されたのと同じ回数EndBusyState呼び出す必要があります。

既定では、フレームワークはアイドル処理中にビジー状態になります。これは、 CWinApp::OnIdle によって実行されます。 アプリケーションがON_COMMANDUPDATEUI通知を処理している間、着信呼び出しはアイドル処理が完了した後に処理されます。

COleMessageFilter::COleMessageFilter

COleMessageFilter オブジェクトを作成します。

COleMessageFilter();

COleMessageFilter::EnableBusyDialog

OLE 呼び出し中にメッセージ保留中の遅延が期限切れになったときに表示される [ビジー] ダイアログ ボックスを有効または無効にします (「 SetRetryReply」を参照)。

void EnableBusyDialog(BOOL bEnableBusy = TRUE);

パラメーター

bEnableBusy
[ビジー] ダイアログ ボックスを有効にするか無効にするかを指定します。

COleMessageFilter::EnableNotRespondingDialog

[応答しない] ダイアログ ボックスを有効または無効にします。これは、OLE 呼び出し中にキーボードまたはマウス メッセージが保留中で、呼び出しがタイムアウトした場合に表示されます。

void EnableNotRespondingDialog(BOOL bEnableNotResponding = TRUE);

パラメーター

bEnableNotResponding
[応答しない] ダイアログ ボックスを有効にするか無効にするかを指定します。

COleMessageFilter::EndBusyState

この関数を呼び出して、ビジー状態を終了します。

virtual void EndBusyState();

解説

BeginBusyState と組み合わせて動作し、アプリケーションのビジー状態を制御します。 関数 SetBusyReply は、ビジー状態のときに呼び出し元のアプリケーションに対するアプリケーションの応答を決定します。

BeginBusyState呼び出しとEndBusyState呼び出しはそれぞれインクリメントとデクリメントで、アプリケーションがビジーかどうかを判断するカウンターです。 たとえば、 BeginBusyState に対する 2 回の呼び出しと、 EndBusyState への 1 回の呼び出しでは、引き続きビジー状態になります。 ビジー状態を取り消すには、BeginBusyStateが呼び出されたのと同じ回数EndBusyState呼び出す必要があります。

既定では、フレームワークはアイドル処理中にビジー状態になります。これは、 CWinApp::OnIdle によって実行されます。 アプリケーションがON_UPDATE_COMMAND_UI通知を処理している間、着信呼び出しはアイドル処理が完了した後に処理されます。

COleMessageFilter::OnMessagePending

OLE 呼び出しの進行中にメッセージを処理するためにフレームワークによって呼び出されます。

virtual BOOL OnMessagePending(const MSG* pMsg);

パラメーター

pMsg
保留中のメッセージへのポインター。

戻り値

正常に完了した場合はゼロ以外、それ以外の場合は 0 です。

解説

呼び出し元のアプリケーションが呼び出しの完了を待機している場合、フレームワークは保留中のメッセージへのポインターを使用して OnMessagePending を呼び出します。 既定では、フレームワークはメッセージWM_PAINTディスパッチするため、時間がかかる呼び出し中にウィンドウの更新が発生する可能性があります。

メッセージ フィルターがアクティブになる前に、 Register の呼び出しによってメッセージ フィルターを登録する必要があります。

COleMessageFilter::Register

OLE システム DLL にメッセージ フィルターを登録します。

BOOL Register();

戻り値

正常に完了した場合はゼロ以外、それ以外の場合は 0 です。

解説

メッセージ フィルターは、システム DLL に登録されていない限り効果はありません。 通常、アプリケーションの初期化コードは、アプリケーションのメッセージ フィルターを登録します。 アプリケーションによって登録されたその他のメッセージ フィルターは、プログラムが Revoke の呼び出しによって終了する前に取り消す必要があります。

フレームワークの既定のメッセージ フィルターは、初期化中に自動的に登録され、終了時に取り消されます。

COleMessageFilter::Revoke

Register の呼び出しによって実行された以前の登録を取り消します。

void Revoke();

解説

プログラムが終了する前に、メッセージ フィルターを取り消す必要があります。

フレームワークによって自動的に作成および登録される既定のメッセージ フィルターも自動的に取り消されます。

COleMessageFilter::SetBusyReply

この関数は、アプリケーションの "ビジー応答" を設定します。

void SetBusyReply(SERVERCALL nBusyReply);

パラメーター

nBusyReply
COMPOBJ.H で定義されている SERVERCALL 列挙からの値。 次のいずれかの値を指定できます。

  • SERVERCALL_ISHANDLED アプリケーションは呼び出しを受け入れますが、特定の呼び出しの処理に失敗する可能性があります。

  • SERVERCALL_REJECTED アプリケーションが呼び出しを処理できなくなる可能性があります。

  • SERVERCALL_RETRYLATER アプリケーションが一時的に呼び出しを処理できない状態です。

解説

BeginBusyState および EndBusyState 関数は、アプリケーションのビジー状態を制御します。

アプリケーションが BeginBusyStateの呼び出しでビジー状態になると、OLE システム DLL からの呼び出しに応答し、 SetBusyReplyの最後の設定によって決定される値を指定します。 呼び出し元のアプリケーションは、このビジー状態の応答を使用して、実行するアクションを決定します。

既定では、ビジー状態の応答はSERVERCALL_RETRYLATER。 この応答により、呼び出し元アプリケーションはできるだけ早く呼び出しを再試行します。

COleMessageFilter::SetMessagePendingDelay

呼び出し元のアプリケーションが、呼び出されたアプリケーションからの応答を待機してから、さらにアクションを実行する時間を決定します。

void SetMessagePendingDelay(DWORD nTimeout = 5000);

パラメーター

nTimeout
メッセージ保留中の遅延のミリ秒数。

解説

この関数は、 SetRetryReply と連携して動作します。

COleMessageFilter::SetRetryReply

呼び出し元アプリケーションからビジー状態の応答を受信したときの呼び出し元アプリケーションのアクションを決定します。

void SetRetryReply(DWORD nRetryReply = 0);

パラメーター

nRetryReply
再試行の間隔 (ミリ秒)。

解説

呼び出されたアプリケーションがビジー状態であることを示す場合、呼び出し元のアプリケーションは、サーバーがビジー状態でなくなるまで待機するか、すぐに再試行するか、指定した間隔で再試行するかを決定できます。 また、呼び出しを完全に取り消すこともできます。

呼び出し元の応答は、 SetRetryReply 関数と SetMessagePendingDelay によって制御されます。 SetRetryReply は、呼び出し元アプリケーションが特定の呼び出しの再試行の間に待機する時間を決定します。 SetMessagePendingDelay は、呼び出し元アプリケーションがサーバーからの応答を待機してからさらにアクションを実行する時間を決定します。

通常、既定値は許容されるため、変更する必要はありません。 フレームワークは、呼び出しが完了するか、メッセージ保留中の遅延が期限切れになるまで、 nRetryReply ミリ秒ごとに呼び出しを再試行します。 nRetryReply の値 0 は即時再試行を指定し、- 1 は呼び出しの取り消しを指定します。

メッセージ保留中の遅延の有効期限が切れると、OLE の [ビジー] ダイアログ ボックス ( COleBusyDialog を参照) が表示され、ユーザーは呼び出しを取り消すか再試行するかを選択できます。 EnableBusyDialog を呼び出して、このダイアログ ボックスを有効または無効にします。

通話中にキーボードまたはマウス のメッセージが保留中で、通話がタイムアウト (メッセージ保留中の遅延を超えた) 場合は、[応答しない] ダイアログ ボックスが表示されます。 EnableNotRespondingDialog を呼び出して、このダイアログ ボックスを有効または無効にします。 通常、この問題の状態は、何かが間違っており、ユーザーがせっかちになっていることを示しています。

ダイアログが無効になっている場合、現在の "再試行応答" は、常にビジー状態のアプリケーションへの呼び出しに使用されます。

関連項目

CCmdTarget クラス
階層図
CCmdTarget クラス