Vínculo a funciones MAPI
Hace referencia a: Outlook 2013 | Outlook 2016
Hay tres métodos de vinculación: vinculación implícita, vinculación explícita y un nuevo modelo híbrido mediante la biblioteca de códigos auxiliares MAPI.
Vinculación implícita
Históricamente, llamar a funciones MAPI en una aplicación de mensajería siempre implicaba la vinculación a la biblioteca Mapi32.lib. Esto incluía el enrutamiento de llamadas MAPI a la biblioteca de código auxiliar mapi de Windows, Mapi32.dll, que luego reenvía las llamadas a la implementación de cliente MAPI predeterminada en tiempo de ejecución. Este proceso de llamada se conoce como vinculación implícita. En el lado izquierdo de la ilustración siguiente se muestra un ejemplo de vinculación implícita usada en un proceso de llamada a función MAPI. El proceso lo inicia una aplicación MAPI e implica la biblioteca MAPI (Mapi32.lib) y el código auxiliar mapi de Windows (Mapi32.dll) y se completa con la implementación del cliente MAPI de Outlook del código auxiliar mapi (Msmapi32.dll).
Comparación de la vinculación implícita y explícita.
Vinculación explícita
Dado que el cliente MAPI predeterminado admite la instalación a petición mediante Windows Installer (MSI), puede desarrollar aplicaciones de mensajería directamente en el código auxiliar MAPI de Outlook en lugar de usar la biblioteca MAPI y el código auxiliar mapi de Windows. En el lado derecho de la ilustración anterior se muestra un ejemplo de un proceso de llamada a función MAPI, empezando por una aplicación MAPI que busca la ruta de acceso y el nombre DLL del código auxiliar mapi de Outlook (paso 2 en la sección siguiente) y realizando llamadas a funciones en el código auxiliar MAPI de Outlook (paso 3 en la sección siguiente). En el procedimiento siguiente se muestra cómo llamar a funciones MAPI mediante la vinculación explícita.
Nota:
Esta información sobre la vinculación explícita puede ser superflua para sus necesidades con la introducción de MAPIStubLibrary.lib que se describe en la sección siguiente. Al igual que el modelo implícito, la nueva biblioteca administra todo e implementa la lógica de vinculación explícita que carga mapi de Outlook directamente.
Para obtener más información sobre la vinculación explícita, consulte Vinculación explícita.
Para llamar a elementos de API MAPI sin la biblioteca MAPI y el código auxiliar mapi de Windows
En el archivo de programa, cree una lista global de punteros de función para cada elemento de API MAPI que esté usando.
En el ejemplo siguiente se muestra este paso.
//Global MAPI function pointers LPMAPIINITIALIZE pfnMAPIInitialize = NULL; LPMAPIUNINITIALIZE pfnMAPIUninitialize = NULL;
Cree una función que inicialice funciones MAPI para vincular a la DLL MAPI del cliente MAPI predeterminado (por ejemplo, Msmapi32.dll de Microsoft Outlook). En esta función, haga lo siguiente:
Cargue mapi32.dll desde el directorio del sistema adecuado.
Propiedad Valor x64 o x86 de forma nativa %windir%\system32\mapi32.dll x86 en modo WoW %windir%\syswow64\mapi32.dll Llame a la función FGetComponentPath para obtener la ruta de acceso y el nombre dll que implementa el subsistema MAPI. Para obtener más información, vea Elegir una versión específica de MAPI para cargar.
Cargue el archivo DLL llamando a la función LoadLibrary.
Inicialice la matriz de punteros de función MAPI llamando a la función GetProcAddress.
En el ejemplo siguiente se muestran los pasos anteriores:
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"); }
Por último, llame a la función que creó en el paso 2 de la aplicación de mensajería antes de realizar llamadas a elementos de LA API MAPI.
Precaución
Debe anular la inicialización del subsistema MAPI antes de cerrar la aplicación.
En el ejemplo siguiente se muestra este paso:
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
La llegada de Microsoft Outlook 2010 y MAPI de 64 bits, que ahora se extienden a la Microsoft Outlook 2013, requiere más que la API tradicional de 32 bits para la implementación completa. Un nuevo proyecto, la biblioteca auxiliar MAPI publicada en GitHub, proporciona un reemplazo de colocación para Mapi32.lib que admite la creación de aplicaciones MAPI de 32 y 64 bits. MAPIStubLibrary.lib elimina la necesidad de vincular explícitamente a MAPI y, después de compilarlo, puede quitar Mapi32.lib de la configuración del enlazador, reemplazándola por MAPIStubLibrary.lib; no se deben necesitar más modificaciones en el código. También elimina la necesidad de escribir código LoadLibrary, GetProcAddress y FreeLibrary para controlar las exportaciones más recientes incluidas en este archivo de biblioteca, pero no en Mapi32.lib, que sería necesario si usara la vinculación explícita.
Algunas de las nuevas funciones vinculadas desde esta biblioteca que no están disponibles en Mapi32.lib incluyen lo siguiente:
- GetDefCachedMode
- HrGetGALFromEmsmdbUID
- HrOpenOfflineObj
- MAPICrashRecovery
- OpenStreamOnFileW
- WrapCompressedRTFStreamEx
Un método alternativo para incorporar la biblioteca de códigos auxiliares MAPI consiste en copiar los archivos de origen, MapiStubLibrary.cpp y StubUtils.cpp, directamente en el proyecto y quitar cualquier vinculación a Mapi32.lib y cualquier código que vincule explícitamente a MAPI.
Para obtener acceso a los archivos de la biblioteca de códigos auxiliares MAPI y para obtener información sobre cómo compilarla e integrarla en el proyecto, así como preguntas sobre esta biblioteca, como cuándo y por qué usarla, consulte la biblioteca de códigos auxiliares MAPI en GitHub.
Vea también
- Información general sobre programación de MAPI
- Instalar el subsistema MAPI
- Instalación de archivos de encabezado MAPI
- Elegir una versión específica de MAPI que se va a cargar
- Determinación del método de vinculación que se va a usar
- Vinculación de un archivo ejecutable a un archivo DLL
- Configuración de las claves MSI para el archivo DLL mapi