次の方法で共有


MAPI の初期化

適用対象: Outlook 2013 | Outlook 2016

MAPI ライブラリを使用するすべてのクライアント アプリケーションは、 MAPIInitialize 関数を呼び出す必要があります。 詳細については、「 MAPIInitialize」を参照してください。 MAPIInitialize は、セッションのグローバル データを初期化し、MAPI ライブラリを準備して呼び出しを受け入れます。 状況によっては、いくつかのフラグを設定することが重要です。

  • MAPI_NT_SERVICE

    クライアントが Windows サービスとして実装されている場合は、MAPI_NT_SERVICE フラグを設定します。 クライアントが Windows サービスであり、このフラグを設定していない場合、MAPI はそれをサービスとして認識しません。

  • MAPI_MULTITHREAD_NOTIFICATIONS

    MAPI_MULTITHREAD_NOTIFICATIONS フラグは、MAPI による通知の管理方法に関連します。 MAPI は、通知を生成するオブジェクトに変更が発生したときにウィンドウ メッセージを受信する非表示ウィンドウを作成します。 ウィンドウ メッセージはある時点で処理され、通知が送信され、適切な IMAPIAdviseSink::OnNotify メソッドが呼び出されます。

  • MAPI_NO_COINIT

    MAPIInitialize が CoInitialize の呼び出しで COM を初期化しないように、MAPI_NO_COINT フラグを設定しますulFlagsMAPI_NO_COINIT に設定された MAPIInitialize にMAPIINIT_0構造体が渡された場合、MAPI は COM が既に初期化済みであると想定し、CoInitialize の呼び出しをバイパスします。

MAPI_MULTITHREAD_NOTIFICATIONS フラグが渡されない場合、MAPI は、最初の MAPIInitialize 呼び出しに使用されたスレッドに通知ウィンドウを作成します。 MAPI_MULTITHREAD_NOTIFICATIONSが渡された場合、MAPI は別のスレッド (通知処理専用のスレッド) に通知ウィンドウを作成します。 MAPI は、非表示の通知ウィンドウを作成するために使用されるスレッドを想定しています。

  • メッセージ ループを使用します。

  • セッションの有効期間を通じてブロックを解除したままにします。

  • クライアントによって作成された他のスレッドよりも有効期間が長くなります。

最初の MAPIInitialize 呼び出しでフラグを設定することで、使用するスレッドを選択できます。 いずれかのスレッドが通知を処理できるようにする危険性は、スレッドが消えると通知ウィンドウが破棄され、他のスレッドに通知を送信できなくなるということです。 また、非表示ウィンドウのメッセージ キューにポストされる通知メッセージのディスパッチを制御するには、特別な処理が必要になる場合があります。

別のウィンドウを使用して通知を処理する場合は、通知が適切なタイミングで適切なスレッドに表示されることを確認してください。 通知ウィンドウに投稿された Windows メッセージをチェックして処理するための特別なコードは必要ありません。

MAPI では、次の種類のクライアント アプリケーションで別のスレッドを使用して、通知サポート用の非表示ウィンドウを作成することをお勧めします。

  • すべてのマルチスレッド クライアント。

  • シングル スレッド Windows サービスと Win32 コンソール アプリケーション。

  • 通知にメイン スレッドを使用する必要のないシングル スレッド クライアント。

個別のスレッド アプローチを使用するには、すべてのスレッドで MAPIInitialize を呼び出し、MAPI_MULTITHREAD_NOTIFICATIONS フラグを設定します。

注:

MAPIInitialize に対するクライアントの最初の呼び出しのみが、通知をサポートするために非表示ウィンドウが作成されます。 後続の呼び出しでは、参照カウントのみがインクリメントされます。