Abrir um anexo
Aplica-se a: Outlook 2013 | Outlook 2016
Abrir um anexo envolve a exibição de seus dados. Por exemplo, quando um anexo de arquivo é aberto, o conteúdo do arquivo é exibido. Enquanto mensagens e pastas são abertas usando seus identificadores de entrada, os anexos são abertos usando seus números de anexo – PR_ATTACH_NUM propriedades. Para obter mais informações, consulte PR_ATTACH_NUM (PidTagAttachNumber). Os números de anexo estão disponíveis por meio da tabela de anexo de uma mensagem.
Para abrir todos os anexos em uma mensagem
Chame o método IMessage::GetAttachmentTable da mensagem para acessar sua tabela de anexos.
Chame HrQueryAllRows para recuperar todas as linhas da tabela.
Para cada linha:
Abra o anexo passando o número de anexo representado na coluna PR_ATTACH_NUM em uma chamada para o método IMessage::OpenAttach da mensagem. Para obter mais informações, consulte IMessage::OpenAttach. OpenAttach retorna um ponteiro para uma implementação IAttach que fornece acesso a propriedades de anexo.
Chame o método IMAPIProp::GetProps do anexo para recuperar sua propriedade PR_ATTACH_METHOD . Para obter mais informações, consulte IMAPIProp::GetProps e PR_ATTACH_METHOD (PidTagAttachMethod).
Se PR_ATTACH_METHOD estiver definido como ATTACH_BY_REF_ONLY, chame IMAPIProp::GetProps para recuperar a propriedade PR_ATTACH_PATHNAME . Para obter mais informações, consulte PR_ATTACH_PATHNAME (PidTagAttachPathname).
Se PR_ATTACH_METHOD estiver definida como ATTACH_BY_VALUE, chame IMAPIProp::OpenProperty para abrir a propriedade PR_ATTACH_DATA_BIN com a interface IStream . Consulte o código de exemplo que segue este procedimento. Para obter mais informações, consulte IMAPIProp::OpenProperty e PR_ATTACH_DATA_BIN (PidTagAttachDataBinary).
Se PR_ATTACH_METHOD estiver definido como ATTACH_OLE e o anexo for um objeto OLE 2:
Chame IMAPIProp::OpenProperty para abrir a propriedade PR_ATTACH_DATA_OBJ com a interface IStreamDocfile . Tente usar essa interface porque é uma implementação do IStream garantida para trabalhar com armazenamento estruturado com a menor quantidade de sobrecarga. Para obter mais informações, consulte PR_ATTACH_DATA_OBJ (PidTagAttachDataObject).
Se a chamada OpenProperty falhar, chame-a novamente para recuperar a propriedade PR_ATTACH_DATA_BIN com a interface IStreamDocfile .
Se esta segunda chamada OpenProperty falhar, tente novamente chamar OpenProperty para recuperar PR_ATTACH_DATA_OBJ. No entanto, em vez de especificar iStreamDocfile, especifique a interface IStorage .
Se PR_ATTACH_METHOD estiver definido como ATTACH_EMBEDDED_MSG, não será incomum que o valor de PR_ATTACH_DATA_OBJ contenha um erro. Isso ocorre porque você e o implementador de tabela não têm como concordar com o tipo de objeto a ser retornado. Para recuperar um ponteiro para a mensagem anexada, abra o anexo usando IMessage::OpenAttach. Em seguida, acesse os dados de anexo chamando seu método IMAPIProp::OpenProperty . Para obter mais informações, consulte IMessage::OpenAttach e IMAPIProp::OpenProperty.
Você pode solicitar que um anexo seja aberto no modo de leitura/gravação ou somente leitura. Somente leitura é o modo padrão e muitos provedores de repositório de mensagens abrem todos os anexos nesse modo, independentemente da solicitação dos clientes. Passe o sinalizador MAPI_BEST_ACCESS para solicitar que o provedor do repositório de mensagens conceda o nível mais alto de acesso que puder e recupere a propriedade PR_ACCESS_LEVEL do anexo aberto para determinar o nível de acesso que foi realmente concedido. Para obter mais informações, consulte PR_ACCESS_LEVEL (PidTagAccessLevel).
O exemplo a seguir mostra como abrir os dados na propriedade PR_ATTACH_DATA_BIN de um anexo. Ele aloca ponteiros para dois fluxos: um para o arquivo e outro para o anexo. A função OpenStreamOnFile abre o fluxo de arquivos no modo somente leitura. A chamada para o método IMAPIProp::OpenProperty do anexo abre o fluxo de anexo no modo de leitura/gravação. Para obter mais informações, consulte PR_ATTACH_DATA_BIN, OpenStreamOnFile e IMAPIProp::OpenProperty. Em seguida, o código copia do fluxo de arquivos para o fluxo de anexo e libera ambos os fluxos.
LPSTREAM pStreamFile, pStreamAtt;
HRESULT hr;
hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer,
STGM_READ, "myfile.doc", NULL, &pStreamFile);
if (HR_SUCCEEDED(hr))
{
// Open the destination stream in the attachment object
hr = pAttach->OpenProperty (PR_ATTACH_DATA_BIN,
&IID_IStream,
0,
MAPI_MODIFY | MAPI_CREATE,
(LPUNKNOWN *)&pStreamAtt);
if (HR_SUCCEEDED(hr))
{
STATSTG StatInfo;
pStreamFile->Stat (&StatInfo, STATFLAG_NONAME);
hResult = pStreamFile->CopyTo (pStreamAtt, StatInfo.cbSize,
NULL, NULL);
pStreamAtt->Release();
}
pStreamFile->Release();
}