Поделиться через


Открытие вложения

Область применения: Outlook 2013 | Outlook 2016

Открытие вложения включает отображение его данных. Например, при открытии вложения файла отображается содержимое файла. В то время как сообщения и папки открываются с использованием идентификаторов записей, вложения открываются с помощью номеров вложений — PR_ATTACH_NUM свойств. Дополнительные сведения см. в разделе PR_ATTACH_NUM (PidTagAttachNumber). Номера вложений доступны через таблицу вложений сообщения.

Открытие всех вложений в сообщении

  1. Вызовите метод IMessage::GetAttachmentTable сообщения, чтобы получить доступ к таблице вложений.

  2. Вызовите HrQueryAllRows , чтобы получить все строки в таблице.

  3. Для каждой строки:

    1. Откройте вложение, передав номер вложения, представленный в столбце PR_ATTACH_NUM в вызове метода IMessage::OpenAttach сообщения. Дополнительные сведения см. в разделе IMessage::OpenAttach. OpenAttach возвращает указатель на реализацию IAttach , которая предоставляет доступ к свойствам вложений.

    2. Вызовите метод IMAPIProp::GetProps вложения, чтобы получить его свойство PR_ATTACH_METHOD . Дополнительные сведения см. в разделе IMAPIProp::GetProps и PR_ATTACH_METHOD (PidTagAttachMethod).

    3. Если PR_ATTACH_METHOD имеет значение ATTACH_BY_REF_ONLY, вызовите IMAPIProp::GetProps , чтобы получить свойство PR_ATTACH_PATHNAME . Дополнительные сведения см . в разделе PR_ATTACH_PATHNAME (PidTagAttachPathname).

    4. Если PR_ATTACH_METHOD имеет значение ATTACH_BY_VALUE, вызовите IMAPIProp::OpenProperty , чтобы открыть свойство PR_ATTACH_DATA_BIN с интерфейсом IStream . См. пример кода, следующий за этой процедурой. Дополнительные сведения см. в разделе IMAPIProp::OpenProperty and PR_ATTACH_DATA_BIN (PidTagAttachDataBinary).

    5. Если для PR_ATTACH_METHOD задано значение ATTACH_OLE, а вложение представляет собой объект OLE 2:

      1. Вызовите IMAPIProp::OpenProperty , чтобы открыть свойство PR_ATTACH_DATA_OBJ с интерфейсом IStreamDocfile . Попробуйте использовать этот интерфейс, так как это реализация IStream гарантированно работает со структурированным хранилищем с минимальным объемом затрат. Дополнительные сведения см . в разделе PR_ATTACH_DATA_OBJ (PidTagAttachDataObject).

      2. Если вызов OpenProperty завершается ошибкой , вызовите его еще раз, чтобы получить свойство PR_ATTACH_DATA_BIN с интерфейсом IStreamDocfile .

      3. Если этот второй вызов OpenProperty завершается ошибкой, повторите попытку вызова OpenProperty для получения PR_ATTACH_DATA_OBJ. Однако вместо указания IStreamDocfile укажите интерфейс IStorage .

  4. Если PR_ATTACH_METHOD имеет значение ATTACH_EMBEDDED_MSG, то значение PR_ATTACH_DATA_OBJ содержит ошибку. Это связано с тем, что вы и средство реализации таблицы не можете согласовать тип возвращаемого объекта. Чтобы получить указатель на присоединенное сообщение, откройте вложение с помощью IMessage::OpenAttach. Затем получите доступ к данным вложения, вызвав его метод IMAPIProp::OpenProperty . Дополнительные сведения см. в разделах IMessage::OpenAttach и IMAPIProp::OpenProperty.

Вы можете запросить открытие вложения в режиме чтения и записи или только для чтения. Режим только для чтения является режимом по умолчанию, и многие поставщики хранилища сообщений открывают в этом режиме все вложения независимо от того, какие клиенты запрашивают. Передайте флаг MAPI_BEST_ACCESS, чтобы запросить предоставление поставщиком хранилища сообщений максимально возможного уровня доступа, а затем получить свойство PR_ACCESS_LEVEL открытого вложения, чтобы определить фактически предоставленный уровень доступа. Дополнительные сведения см. в разделе PR_ACCESS_LEVEL (PidTagAccessLevel).

В следующем примере показано, как открыть данные в свойстве PR_ATTACH_DATA_BIN вложения. Он выделяет указатели на два потока: один для файла и один для вложения. Функция OpenStreamOnFile открывает файловый поток в режиме только для чтения. Вызов метода IMAPIProp::OpenProperty вложения открывает поток вложений в режиме чтения и записи. Дополнительные сведения см . в разделах PR_ATTACH_DATA_BIN, OpenStreamOnFile и IMAPIProp::OpenProperty. Затем код копирует из файлового потока в поток вложений и освобождает оба потока.

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