Usando objetos Thread-Safe
Aplica-se a: Outlook 2013 | Outlook 2016
Os aplicativos cliente podem assumir que os objetos usados diretamente ou como retornos de chamada são sempre seguros por thread, exceto nos seguintes casos:
O objeto status de um provedor de transporte obtido por meio de uma chamada de cliente para IMAPISession::OpenEntry com um identificador de entrada da linha de tabela status do provedor.
Todos os objetos de formulário MAPI obtidos por meio de uma chamada de cliente para MAPIOpenFormMgr. Os objetos de formulário obedecem às regras do modelo de apartamento e os clientes devem usá-los e todos os objetos contidos por eles somente no thread que os criou.
Quando um cliente acessa a linha de um provedor de transporte na tabela status que inclui o identificador de entrada do objeto status associado, o cliente pode chamar OpenEntry com esse identificador de entrada para abrir o objeto status. Esse objeto status não é thread-safe porque os provedores de transporte são executados no contexto do spooler MAPI e não mantêm um contexto separado para seu objeto status. O objeto status obedece às regras do modelo de apartamento e os clientes devem usá-lo apenas no thread que o criou.
Um cliente também deve invocar MAPIInitialize em cada thread antes de usar quaisquer objetos MAPI e MAPIUninitialize quando esse uso estiver concluído. Essas chamadas devem ser feitas mesmo se os objetos a serem usados forem passados para o thread de uma origem externa. MAPIInitialize e MAPIUninitialize podem ser chamados de qualquer lugar, exceto de dentro de uma função DllMain win32, uma função que é invocada pelo sistema quando processos e threads são inicializados e encerrados, ou em chamadas para as funções LoadLibrary e FreeLibrary .
Os objetos de uso indireto nunca devem ser considerados thread-safe. Os objetos de uso indireto são retornados por métodos que exigem ponteiros de interface de destino como parâmetros de entrada. Exemplos desses métodos são IMAPIProp::CopyTo e CopyProps, IMAPIFolder::CopyFolder e CopyMessage e IMsgServiceAdmin::CopyMsgService. Se um provedor de serviços quiser chamar esse objeto de um thread diferente do que foi passado, o provedor será responsável por empacotar explicitamente o objeto.