Compartilhar via


Link para funções MAPI

Aplica-se a: Outlook 2013 | Outlook 2016

Existem três métodos de ligação: ligação implícita, ligação explícita e um novo modelo híbrido com a Biblioteca MAPI Stub.

Ligação implícita

Historicamente, chamar funções MAPI numa aplicação de mensagens sempre envolveu a ligação à biblioteca Mapi32.lib. Isto incluía o encaminhamento de chamadas MAPI para a biblioteca de stub mapi do Windows, Mapi32.dll, que reencaminhava as chamadas para a implementação predefinida do cliente MAPI no tempo de execução. Este processo de chamada é conhecido como ligação implícita. O lado esquerdo da figura seguinte mostra um exemplo de ligação implícita utilizada num processo de chamada de função MAPI. O processo é iniciado por uma aplicação 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 Outlook do stub MAPI (Msmapi32.dll).

Comparação das ligações implícitas e explícitas.

Comparação da ligação implícita e explícita

Ligação explícita

Uma vez que o cliente MAPI predefinido suporta a instalação a pedido com o Windows Installer (MSI), pode desenvolver aplicações de mensagens diretamente no stub MAPI do Outlook em vez de utilizar 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 uma aplicação MAPI à procura do caminho e do nome DLL para o stub MAPI do Outlook (passo 2 na secção seguinte) e efetuando chamadas de função para o stub MAPI do Outlook (passo 3 na secção seguinte). O procedimento seguinte mostra como chamar funções MAPI através de ligações explícitas.

Observação

Estas informações sobre a ligação explícita podem ser supérfluas para as suas necessidades com a introdução de MAPIStubLibrary.lib abordada na secção seguinte. Tal como o modelo implícito, a nova biblioteca gere tudo e implementa a lógica de ligação explícita que carrega diretamente o MAPI do Outlook.

Para obter mais informações sobre a ligação explícita, consulte Ligar Explicitamente.

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

  1. No ficheiro de programa, crie uma lista global de ponteiros de função para cada elemento da API MAPI que estiver a utilizar.

    O exemplo seguinte mostra este passo.

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

    1. Carregue mapi32.dll a partir do diretório de sistema adequado.

      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, veja Escolher uma Versão Específica do MAPI para Carregar.

    3. Carregue a DLL ao chamar a função LoadLibrary.

    4. Inicialize a matriz de ponteiro da função MAPI ao chamar a função GetProcAddress.

    O exemplo seguinte mostra os passos 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 criou no passo 2 na sua aplicação de mensagens antes de fazer chamadas para elementos da API MAPI.

    Cuidado

    Tem de desinstalar o subsistema MAPI antes de fechar a aplicação.

    O exemplo seguinte mostra este passo:

     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 de Microsoft Outlook 2010 e MAPI de 64 bits, que agora se estende ao Microsoft Outlook 2013, requer mais do que a API de 32 bits tradicional para implementação completa. Um novo projeto, a Biblioteca MAPI Stub publicada no GitHub, fornece uma substituição pendente para Mapi32.lib que suporta a criação de aplicações MAPI de 32 bits e de 64 bits. MAPIStubLibrary.lib elimina a necessidade de ligar explicitamente ao MAPI e, depois de o ter criado, pode remover Mapi32.lib das definições do linker, substituindo-o por MAPIStubLibrary.lib; Não devem ser necessárias mais modificações ao código. Também elimina a necessidade de escrever o código LoadLibrary, GetProcAddress e FreeLibrary para processar exportações mais recentes incluídas neste ficheiro de biblioteca, mas não em Mapi32.lib, o que seria necessário se utilizasse uma ligação explícita.

Algumas das novas funções ligadas a partir desta biblioteca que não estão disponíveis em Mapi32.lib incluem o seguinte:

Um método alternativo de incorporação da Biblioteca MAPI Stub é copiar os ficheiros de origem, MapiStubLibrary.cpp e StubUtils.cpp, diretamente no seu projeto e remover qualquer ligação para Mapi32.lib e qualquer código que ligue explicitamente a MAPI.

Para aceder aos ficheiros da Biblioteca MAPI Stub e para obter informações sobre como compilá-los e integrá-los no seu projeto, bem como perguntas sobre esta biblioteca, como quando e porquê utilizá-la, consulte a Biblioteca MAPI Stub no GitHub.

Confira também