Поделиться через


Ссылки на функции MAPI

Область применения: Outlook 2013 | Outlook 2016

Существует три метода связывания: неявное связывание, явное связывание и новая гибридная модель с использованием библиотеки заглушки MAPI.

Неявное связывание

Исторически вызов функций MAPI в приложении для обмена сообщениями всегда включал связывание с библиотекой Mapi32.lib. Это включало маршрутизацию вызовов MAPI в библиотеку заглушки Windows MAPI, Mapi32.dll, которая затем перенаправила вызовы в реализацию клиента MAPI по умолчанию во время выполнения. Этот процесс вызова называется неявным связыванием. В левой части следующего рисунка показан пример неявного связывания, используемого в процессе вызова функции MAPI. Процесс инициируется приложением MAPI и включает библиотеку MAPI (Mapi32.lib) и заглушку MAPI Windows (Mapi32.dll) и завершается реализацией заглушки MAPI в Outlook (Msmapi32.dll).

Сравнение неявного и явного связывания.

Сравнение неявного и явного связывания

Явное связывание

Так как клиент MAPI по умолчанию поддерживает установку по запросу с помощью установщика Windows (MSI), вы можете разрабатывать приложения для обмена сообщениями непосредственно на заглушку MAPI Outlook, а не использовать библиотеку MAPI и заглушку Windows MAPI. В правой части предыдущего рисунка показан пример процесса вызова функции MAPI, начиная с приложения MAPI, который ищет путь и имя БИБЛИОТЕКи DLL для заглушки OUTLOOK MAPI (шаг 2 в следующем разделе) и выполнение вызовов функций в заглушку MAPI Outlook (шаг 3 в следующем разделе). В следующей процедуре показано, как вызывать функции MAPI с помощью явной компоновки.

Примечание.

Эти сведения об явном связывании могут быть лишними для ваших потребностей с введением MAPIStubLibrary.lib, рассмотренным в следующем разделе. Как и неявная модель, новая библиотека управляет всем и реализует явную логику связывания, которая напрямую загружает MAPI Outlook.

Дополнительные сведения об явном связывании см. в разделе Явное связывание.

Вызов элементов API MAPI без библиотеки MAPI и заглушки MAPI Для Windows

  1. В файле программы создайте глобальный список указателей функций для каждого используемого элемента API MAPI.

    Этот шаг показан в следующем примере.

     //Global MAPI function pointers
     LPMAPIINITIALIZE pfnMAPIInitialize = NULL;
     LPMAPIUNINITIALIZE pfnMAPIUninitialize = NULL;
    
  2. Создайте функцию, которая инициализирует функции MAPI для связывания с библиотекой DLL MAPI клиента MAPI по умолчанию (например, Msmapi32.dll Microsoft Outlook). В этой функции выполните следующие действия.

    1. Загрузите mapi32.dll из соответствующего системного каталога.

      Свойство Значение
      x64 или x86 в собственном коде
      %windir%\system32\mapi32.dll
      x86 в режиме WoW
      %windir%\syswow64\mapi32.dll
    2. Вызовите функцию FGetComponentPath , чтобы получить путь и имя БИБЛИОТЕКи DLL, реализующие подсистему MAPI. Дополнительные сведения см. в разделе Выбор конкретной версии MAPI для загрузки.

    3. Загрузите библиотеку DLL, вызвав функцию LoadLibrary.

    4. Инициализация массива указателей функции MAPI путем вызова функции GetProcAddress.

    В следующем примере показаны предыдущие шаги.

     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. Наконец, вызовите функцию, созданную на шаге 2 в приложении для обмена сообщениями, прежде чем выполнять вызовы элементов API MAPI.

    Предостережение

    Перед закрытием приложения необходимо неинициализировать подсистему 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 для полной реализации. Новый проект, библиотека заглушки MAPI , размещенная на GitHub, предоставляет замену mapi32.lib, которая поддерживает создание как 32-разрядных, так и 64-разрядных приложений MAPI. MAPIStubLibrary.lib устраняет необходимость явного связывания с MAPI, и после его сборки вы можете удалить Mapi32.lib из параметров компоновщика, заменив его MAPIStubLibrary.lib; Никаких дополнительных изменений в коде не требуется. Это также устраняет необходимость написания кода LoadLibrary, GetProcAddress и FreeLibrary для обработки новых экспортов, включенных в этот файл библиотеки, но не в Mapi32.lib, что потребуется при использовании явной компоновки.

Некоторые из новых функций, связанных с этой библиотекой, которые недоступны в Mapi32.lib, включают следующие:

Другой способ включения библиотеки заглушки MAPI заключается в копировании исходных файлов, MapiStubLibrary.cpp и StubUtils.cpp, непосредственно в проект и удалении ссылок на Mapi32.lib и любого кода, который явно ссылается на MAPI.

Чтобы получить доступ к файлам библиотеки заглушки MAPI и сведения о том, как создать и интегрировать ее в проект, а также вопросы об этой библиотеке, например когда и зачем ее использовать, см. в статье Библиотека заглушки MAPI на сайте GitHub.

См. также