Link para funções MAPI

Aplica-se a: Outlook 2013 | Outlook 2016

Há três métodos de vinculação: vinculação implícita, vinculação explícita e um novo modelo híbrido usando a Biblioteca de Stub mapi.

Vinculação implícita

Historicamente, chamar funções MAPI em um aplicativo de mensagens sempre envolveu a vinculação à biblioteca Mapi32.lib. Isso incluiu o roteamento de chamadas MAPI para a biblioteca de stub do Windows MAPI, Mapi32.dll, que encaminhou as chamadas para a implementação padrão do cliente MAPI em tempo de execução. Esse processo de chamada é conhecido como vinculação implícita. O lado esquerdo da figura a seguir mostra um exemplo de vinculação implícita usada em um processo de chamada de função MAPI. O processo é iniciado por um aplicativo MAPI e envolve a biblioteca MAPI (Mapi32.lib) e o stub mapi do Windows (Mapi32.dll) e é concluído pela implementação do cliente MAPI do MAPI (Msmapi32.dll).

Comparação de vinculação implícita e explícita.

Comparação de vinculação implícita e explícita

Vinculação explícita

Como o cliente MAPI padrão dá suporte à instalação sob demanda usando o MSI (Windows Installer), você pode desenvolver aplicativos de mensagens diretamente no stub mapi do Outlook em vez de usar a biblioteca MAPI e o stub mapi do Windows. O lado direito da figura anterior mostra um exemplo de um processo de chamada de função MAPI, começando com um aplicativo MAPI procurando o caminho e o nome de DLL para o stub mapi do Outlook (etapa 2 na seção a seguir) e fazendo chamadas de função para o stub mapi do Outlook (etapa 3 na seção a seguir). O procedimento a seguir mostra como chamar funções MAPI usando a vinculação explícita.

Observação

Essas informações sobre a vinculação explícita podem ser supérfluas às suas necessidades com a introdução do MAPIStubLibrary.lib discutido na seção a seguir. Assim como o modelo implícito, a nova biblioteca gerencia tudo e implementa a lógica de vinculação explícita que carrega o MAPI do Outlook diretamente.

Para obter mais informações sobre a vinculação explícita, consulte Vincular explicitamente.

Para chamar elementos de API MAPI sem a biblioteca MAPI e o stub mapi do Windows

  1. No arquivo do programa, crie uma lista global de ponteiros de função para cada elemento de API MAPI que você está usando.

    O exemplo a seguir mostra essa etapa.

     //Global MAPI function pointers
     LPMAPIINITIALIZE pfnMAPIInitialize = NULL;
     LPMAPIUNINITIALIZE pfnMAPIUninitialize = NULL;
    
  2. Crie uma função que inicialize funções MAPI para vincular à DLL MAPI do cliente MAPI padrão (por exemplo, Msmapi32.dll do Microsoft Outlook). Nesta função, faça o seguinte:

    1. Carregue mapi32.dll do diretório do sistema apropriado.

      Propriedade Valor
      x64 ou x86 nativamente
      %windir%\system32\mapi32.dll
      x86 no modo WoW
      %windir%\syswow64\mapi32.dll
    2. Chame a função FGetComponentPath para obter o caminho e o nome DLL que implementa o subsistema MAPI. Para obter mais informações, consulte Escolher uma versão específica do MAPI para carregar.

    3. Carregue a DLL chamando a função LoadLibrary.

    4. Inicialize a matriz de ponteiro de função MAPI chamando a função GetProcAddress.

    O exemplo a seguir mostra as etapas 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");
     }
    
  3. Por fim, chame a função que você criou na etapa 2 em seu aplicativo de mensagens antes de fazer chamadas para elementos de API MAPI.

    Cuidado

    Você deve uninitializar o subsistema MAPI antes de fechar seu aplicativo.

    O exemplo a seguir mostra esta etapa:

     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

O advento do MAPI de Microsoft Outlook 2010 e 64 bits, que agora se estende até o Microsoft Outlook 2013, requer mais do que a API tradicional de 32 bits para implementação completa. Um novo projeto, a Biblioteca MAPI Stub, postado no site CodePlex fornece uma substituição suspensa para Mapi32.lib que dá suporte à criação de aplicativos MAPI de 32 bits e 64 bits. MAPIStubLibrary.lib elimina a necessidade de vincular explicitamente ao MAPI e, depois de construí-lo, você pode remover Mapi32.lib das configurações do vinculador, substituindo-o por MAPIStubLibrary.lib; nenhuma modificação adicional em seu código deve ser necessária. Ele também elimina a necessidade de gravar o código LoadLibrary, GetProcAddress e FreeLibrary para lidar com exportações mais recentes incluídas neste arquivo de biblioteca, mas não em Mapi32.lib, o que seria necessário se você usasse a vinculação explícita.

Algumas das novas funções vinculadas a esta biblioteca que não estão disponíveis no Mapi32.lib incluem o seguinte:

Um método alternativo de incorporar a Biblioteca stub mapi é copiar os arquivos de origem, MapiStubLibrary.cpp e StubUtils.cpp, diretamente em seu projeto e remover qualquer vinculação a Mapi32.lib e qualquer código que se vincule explicitamente ao MAPI.

Para acessar os arquivos da Biblioteca stub mapi e para obter informações sobre como compilar e integrá-lo ao seu projeto, bem como perguntas sobre essa biblioteca, como quando e por que usá-la, consulte a Biblioteca MAPI Stub no site CodePlex.

Confira também