MAPI スプーラーとの対話
適用対象: Outlook 2013 | Outlook 2016
IXPLogon のメソッド: IUnknown インターフェイスは、トランスポート プロバイダーを呼び出すときに MAPI スプーラーによって使用されます。 ほとんどの種類のトランスポート プロバイダーは、これらのメソッドの大部分を実装して、迅速に戻ることができるようにする必要があります。 メソッドが戻るまでに時間がかかる場合は、MAPI スプーラーへの呼び出しで分割して他のタスクの CPU を解放する必要があるため、これは望ましいことです。
MAPI スプーラーは、その作業を行い、フォアグラウンド アプリケーションがアイドル状態のときにトランスポート プロバイダーへの呼び出しを行います。 必要に応じて、トランスポート プロバイダーが最初にログオンしたときにダイアログ ボックスを表示した後 (MAPI からトランスポート プロバイダーに渡されるフラグによって管理されます)、トランスポート プロバイダーは、クライアントが送信キューと受信キューをフラッシュするために呼び出されない限り、バックグラウンドで動作します。 キューのフラッシュは、トランスポート プロバイダーが CPU を解放する必要がない唯一の時間であり、ユーザーに長時間のアクションが進行中であることが通知された場合にのみ発生します。 MAPI スプーラーは通常、トランスポート プロバイダーがユーザー アクションに応答してキューをフラッシュするように要求するため、トランスポート プロバイダーは通常、ユーザーに通知されるように何もする必要はありません。
トランスポート プロバイダーは、個別にキューをフラッシュし、その状態行のPR_STATUS_CODE (PidTagStatusCode) プロパティのSTATUS_INBOUND_FLUSHとSTATUS_OUTBOUND_FLUSH ビットを使用して、MAPI スプーラーに注意を喚起して、ジョブを完了できるように通知することができます。 状態行は、 IMAPISupport::ModifyStatusRow メソッドを使用して更新されます。 この場合、トランスポート プロバイダーは、進行状況インジケーターまたはその他のインターフェイスを表示して、長いアクションが発生していることをユーザーに通知する必要があります。
多くの場合、ネットワーク アクティビティには 0.2 秒を超える時間がかかるため、トランスポート プロバイダーは可能な限り非同期ネットワーク要求を使用する必要があります。 これにより、要求を開始し、MAPI スプーラーに呼び戻すことによって CPU を解放し、MAPI スプーラーが再び制御を提供すると、ネットワーク要求が完了したかどうかを確認チェック。 まだ完了していない場合は、 IMAPISupport::SpoolerYield メソッドを使用して MAPI スプーラーに再度呼び出して CPU を解放します。
メッセージ処理中、 IXPLogon::SubmitMessage と IXPLogon::EndMessage の間と IXPLogon::StartMessage の間で、トランスポート プロバイダーは通常、MAPI スプーラーによって公開されるオブジェクトに対して多くの呼び出しを行います。 MAPI スプーラーは、これらのオブジェクトの処理の一環として、トランスポート プロバイダーが必要に応じて独自に生成することで、バックグラウンド プロセスとして適切に動作するのに役立ちます。 タイム クリティカルな処理を必要とするトランスポート プロバイダーは、 IMAPISupport::SpoolerNotify サポート オブジェクト メソッドを使用して、MAPI スプーラーに重要なセクションを宣言できます。 この場合、トランスポート プロバイダーが SpoolerNotify への別の呼び出しで重要なセクション処理を終了するまで、トランスポート プロバイダーによる明示的な SpoolerYield 呼び出しでのみ CPU が解放されます。
注:
これは、Win32 クリティカル セクションと同じではありません。 これは、トランスポート プロバイダーが FAX 回線から受信データを読み取るなどの外部リソースをリアルタイムで制御する必要がある場合にのみ行う必要があります。 これにより MAPI スプーラー プロセスの優先順位が上がり、操作中にワークステーションが応答しなくなる可能性があるため、長いアクションが進行中である可能性があることをユーザーに通知し、可能であれば進行状況インジケーターを提供することをお勧めします。