次の方法で共有


IMessageFilter::MessagePending メソッド (objidl.h)

COM がリモート呼び出しへの応答を待機している間にメッセージが到着したことを示します。

発信呼び出しの完了を待っている間に入力を処理すると、複雑になる可能性があります。 アプリケーションは、呼び出しを中断せずにメッセージを処理するか、待機を続けるか、操作を取り消すかを決定する必要があります。

構文

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

パラメーター

[in] htaskCallee

呼び出されたアプリケーションのスレッド ID。

[in] dwTickCount

呼び出しが行われた後のティック数。 GetTickCount 関数から計算されます。

[in] dwPendingType

メッセージまたはイベントを受信した呼び出しの種類。 指定できる値は列挙 PENDINGTYPE です。PENDINGTYPE_TOPLEVELは、発信呼び出しが別のアプリケーションからの呼び出し内で入れ子にされていないことを意味PENDINTGYPE_NESTED、発信呼び出しが別のアプリケーションからの呼び出し内で入れ子にされたことを意味します。

戻り値

このメソッドは、次の値を返すことができます。

リターン コード 説明
PENDINGMSG_CANCELCALL
発信通話を取り消します。 これは、極端な条件下でのみ返す必要があります。 応答または拒否されていない呼び出しを取り消すと、孤立したトランザクションが作成され、リソースが失われる可能性があります。 COM は元の呼び出しに失敗し、RPC_E_CALL_CANCELLEDを返します。
PENDINGMSG_WAITNOPROCESS
未使用。
PENDINGMSG_WAITDEFPROCESS
キーボードとマウスのメッセージはディスパッチされなくなりました。 ただし、マウスとキーボードのメッセージによってシステムがデッドロックする可能性があり、このような場合はマウスとキーボードのメッセージが破棄される場合があります。 WM_PAINTメッセージがディスパッチされます。 タスク切り替えメッセージとアクティブ化メッセージは、以前と同様に処理されます。

注釈

COM は、アプリケーションが COM メソッド呼び出しを行った後に MessagePending を呼び出し、呼び出しが返される前に Windows メッセージが発生します。 たとえば、ユーザーがメニュー コマンドを選択したり、オブジェクトをダブルクリックしたりすると、Windows メッセージが送信されます。 COM が MessagePending 呼び出しを行う前に、元の COM メソッド呼び出しが行われた後の経過時間を計算します。 COM は dwTickCount パラメーターで経過時間を提供します。 それまでの間、COM はキューからメッセージを削除しません。

呼び出し元のキューに表示される Windows メッセージは、メッセージが先に入力した結果ではなく、注意を引く試みであることを確認するために十分な時間が経過するまでキューに残る必要があります。 dwTickCount パラメーターを使用して遅延を設定します。2 秒または 3 秒の遅延をお勧めします。 その時間が経過し、呼び出しが完了していない場合、呼び出し元はキューからメッセージをフラッシュする必要があります。OLE UI ビジー ダイアログ ボックスが表示されます。このダイアログ ボックスには、呼び出しを再試行する (待機を続ける) か、指定したタスクに切り替えるかを選択できます。 これにより、次の動作が保証されます。

  • 適切な時間内に呼び出しが完了した場合は、先行入力が正しく処理されます。
  • 呼び出し先が応答しない場合、先行入力は誤って解釈されず、ユーザーは問題を解決するために行動できます。 たとえば、OLE 1 サーバーは、モーダル ダイアログ ボックスで応答せずに要求をキューに入れます。
発信呼び出しの完了を待っている間に入力を処理すると、複雑になる可能性があります。 アプリケーションは、呼び出しを中断せずにメッセージを処理するか、待機を続けるか、操作を取り消すかを決定する必要があります。

元の COM 呼び出しに応答がない場合、アプリケーションは、そのストレージで IStorage::Revert を呼び出すことによって、呼び出しを取り消し、COM オブジェクトを一貫した状態に復元できます。 オブジェクトは、コンテナーをシャットダウンできる場合に解放できます。 ただし、呼び出しを取り消すと、孤立した操作やリソース リークが発生する可能性があります。 キャンセルは、最後の手段としてのみ使用する必要があります。 アプリケーションでは、このような呼び出しの取り消しを許可しないことを強くお勧めします。

メモhtaskCallee パラメーターは HTASK として入力されますが、呼び出されたスレッドのスレッド ID が含まれています。 IMessageFilter インターフェイスを実装するときは、OpenThread 関数を呼び出して htaskCallee パラメーターからスレッド ハンドルを取得し、GetProcessIdOfThread 関数を呼び出してプロセス ID を取得できます。
 

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー objidl.h

こちらもご覧ください

IMessageFilter

OleUIBusy