Ссылки на функции 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
В файле программы создайте глобальный список указателей функций для каждого используемого элемента API MAPI.
Этот шаг показан в следующем примере.
//Global MAPI function pointers LPMAPIINITIALIZE pfnMAPIInitialize = NULL; LPMAPIUNINITIALIZE pfnMAPIUninitialize = NULL;
Создайте функцию, которая инициализирует функции MAPI для связывания с библиотекой DLL MAPI клиента MAPI по умолчанию (например, Msmapi32.dll Microsoft Outlook). В этой функции выполните следующие действия.
Загрузите mapi32.dll из соответствующего системного каталога.
Свойство Значение x64 или x86 в собственном коде %windir%\system32\mapi32.dll x86 в режиме WoW %windir%\syswow64\mapi32.dll Вызовите функцию FGetComponentPath , чтобы получить путь и имя БИБЛИОТЕКи DLL, реализующие подсистему MAPI. Дополнительные сведения см. в разделе Выбор конкретной версии MAPI для загрузки.
Загрузите библиотеку DLL, вызвав функцию LoadLibrary.
Инициализация массива указателей функции 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"); }
Наконец, вызовите функцию, созданную на шаге 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, включают следующие:
- GetDefCachedMode
- HrGetGALFromEmsmdbUID
- HrOpenOfflineObj
- MAPICrashRecovery
- OpenStreamOnFileW
- WrapCompressedRTFStreamEx
Другой способ включения библиотеки заглушки MAPI заключается в копировании исходных файлов, MapiStubLibrary.cpp и StubUtils.cpp, непосредственно в проект и удалении ссылок на Mapi32.lib и любого кода, который явно ссылается на MAPI.
Чтобы получить доступ к файлам библиотеки заглушки MAPI и сведения о том, как создать и интегрировать ее в проект, а также вопросы об этой библиотеке, например когда и зачем ее использовать, см. в статье Библиотека заглушки MAPI на сайте GitHub.