Compartilhar via


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

  1. Chame o método IMessage::GetAttachmentTable da mensagem para acessar sua tabela de anexos.

  2. Chame HrQueryAllRows para recuperar todas as linhas da tabela.

  3. Para cada linha:

    1. 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.

    2. 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).

    3. 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).

    4. 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).

    5. Se PR_ATTACH_METHOD estiver definido como ATTACH_OLE e o anexo for um objeto OLE 2:

      1. 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).

      2. Se a chamada OpenProperty falhar, chame-a novamente para recuperar a propriedade PR_ATTACH_DATA_BIN com a interface IStreamDocfile .

      3. 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 .

  4. 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();
}