MAPI 機能へのリンク

適用対象: Outlook 2013 | Outlook 2016

リンクには、暗黙的なリンク、明示的なリンク、MAPI スタブ ライブラリを使用した新しいハイブリッド モデルの 3 つの方法があります。

暗黙的なリンク

これまで、メッセージング アプリケーションで MAPI 関数を呼び出すには、常に Mapi32.lib ライブラリへのリンクが必要でした。 これには、Windows MAPI スタブ ライブラリへの MAPI 呼び出しのルーティング Mapi32.dll 含まれ、その後、呼び出しが実行時に既定の MAPI クライアント実装に転送されました。 この呼び出しプロセスは、暗黙的なリンクと呼ばれます。 次の図の左側は、MAPI 関数呼び出しプロセスで使用される暗黙的なリンクの例を示しています。 このプロセスは MAPI アプリケーションによって開始され、MAPI ライブラリ (Mapi32.lib) と Windows MAPI スタブ (Mapi32.dll) が含まれており、MAPI スタブ (Msmapi32.dll) の Outlook MAPI クライアント実装によって完了されます。

暗黙的リンクと明示的リンクの比較。

暗黙的および明示的なリンク

明示的なリンク

既定の MAPI クライアントでは Windows インストーラー (MSI) を使用したオンデマンド インストールがサポートされているため、MAPI ライブラリと Windows MAPI スタブを使用する代わりに、Outlook MAPI スタブでメッセージング アプリケーションを直接開発できます。 前の図の右側は、MAPI 関数呼び出しプロセスの例を示しています。MAPI アプリケーションで Outlook MAPI スタブのパスと DLL 名を検索し (次のセクションの手順 2)、Outlook MAPI スタブに関数呼び出しを行う (次のセクションの手順 3)。 次の手順では、明示的なリンクを使用して MAPI 関数を呼び出す方法を示します。

注:

明示的なリンクに関するこの情報は、次のセクションで説明する MAPIStubLibrary.lib の導入により、ニーズに余分になる可能性があります。 暗黙的なモデルと同様に、新しいライブラリはすべてを管理し、Outlook の MAPI を直接読み込む明示的なリンク ロジックを実装します。

明示的なリンクの詳細については、「明示的にリンクする」を参照してください。

MAPI ライブラリと Windows MAPI スタブなしで MAPI API 要素を呼び出すには

  1. プログラム ファイルで、使用している MAPI API 要素ごとに関数ポインターのグローバル リストを作成します。

    次の例は、この手順を示しています。

     //Global MAPI function pointers
     LPMAPIINITIALIZE pfnMAPIInitialize = NULL;
     LPMAPIUNINITIALIZE pfnMAPIUninitialize = NULL;
    
  2. MAPI 関数を初期化して、既定の MAPI クライアントの MAPI DLL (Microsoft Outlook の Msmapi32.dll など) にリンクする関数を作成します。 この関数では、次の操作を行います。

    1. 適切なシステム ディレクトリから mapi32.dll を読み込みます。

      プロパティ
      x64 または x86 ネイティブ
      %windir%\system32\mapi32.dll
      WoW モードの x86
      %windir%\syswow64\mapi32.dll
    2. FGetComponentPath 関数を呼び出して、MAPI サブシステムを実装するパスと DLL 名を取得します。 詳細については、「 読み込む MAPI の特定のバージョンを選択する」を参照してください。

    3. LoadLibrary 関数を呼び出して DLL を読み込みます。

    4. GetProcAddress 関数を呼び出して、MAPI 関数ポインター配列を初期化します。

    次の例は、前の手順を示しています。

     void InitializeMapiFunctions()
     {
     {
         // Get the DLL path and name of the actual MAPI implementation.
         FGetComponentPath(g_szMapiComponentGUID, NULL, szMAPIDLL, MAX_PATH);
         // Load the DLL.
         hMod = LoadLibrary(szMAPIDLL);
         // Initialize MAPI functions.
         pfnMAPIInitialize = GetProcAddress(hMod, "MAPIInitialize");
         pfnMAPIUninitialize = GetProcAddress(hMod, "MAPIUninitialize");
     }
    
  3. 最後に、MAPI API 要素を呼び出す前に、メッセージング アプリケーションの手順 2 で作成した関数を呼び出します。

    注意

    アプリケーションを閉じる前に、MAPI サブシステムを初期化解除する必要があります。

    次の例は、この手順を示しています。

     int main()
     {
         HRESULT hr;
         InitializeMapiFunctions();
         // Initialize the MAPI subsystem.
         hr = (*pfnMAPIInitialize)(NULL);
         if (hr!= S_OK)
         {
             // Handle the error case.
         }
         // Here is where you make calls to other MAPI interfaces.
         // Uninitialize the MAPI subsystem.
         (*pfnMAPIUninitialize)();
     return (0);
     }
    

MAPIStubLibrary.lib

Microsoft Outlook 2010と 64 ビット MAPI の登場により、Microsoft Outlook 2013まで拡張され、完全な実装には従来の 32 ビット API 以上が必要になります。 CodePlex Web サイトに掲載されている新しいプロジェクトである MAPI スタブ ライブラリは、32 ビットと 64 ビットの MAPI アプリケーションの両方の構築をサポートする Mapi32.lib のドロップイン置換を提供します。 MAPIStubLibrary.lib を使用すると、MAPI に明示的にリンクする必要がなくなります。MAPI をビルドすると、リンカー設定から Mapi32.lib を削除し、MAPIStubLibrary.lib に置き換えることができます。コードのそれ以上の変更は必要ありません。 また、このライブラリ ファイルに含まれているが Mapi32.lib に含まれていない新しいエクスポートを処理するために LoadLibraryGetProcAddressFreeLibrary コードを記述する必要がなくなります。明示的なリンクを使用した場合に必要になります。

Mapi32.lib では使用できない、このライブラリからリンクされた新しい関数の一部を次に示します。

MAPI スタブ ライブラリを組み込む別の方法は、ソース ファイル、MapiStubLibrary.cpp、StubUtils.cppをプロジェクトに直接コピーし、Mapi32.lib へのリンケージと MAPI に明示的にリンクするコードを削除することです。

MAPI スタブ ライブラリ ファイルにアクセスし、プロジェクトにビルドして統合する方法と、このライブラリを使用するタイミングや理由などの質問については、CodePlex サイトの MAPI スタブ ライブラリ を参照してください。

関連項目