Открытие вложения
Область применения: Outlook 2013 | Outlook 2016
Открытие вложения включает отображение его данных. Например, при открытии вложения файла отображается содержимое файла. В то время как сообщения и папки открываются с использованием идентификаторов записей, вложения открываются с помощью номеров вложений — PR_ATTACH_NUM свойств. Дополнительные сведения см. в разделе PR_ATTACH_NUM (PidTagAttachNumber). Номера вложений доступны через таблицу вложений сообщения.
Открытие всех вложений в сообщении
Вызовите метод IMessage::GetAttachmentTable сообщения, чтобы получить доступ к таблице вложений.
Вызовите HrQueryAllRows , чтобы получить все строки в таблице.
Для каждой строки:
Откройте вложение, передав номер вложения, представленный в столбце PR_ATTACH_NUM в вызове метода IMessage::OpenAttach сообщения. Дополнительные сведения см. в разделе IMessage::OpenAttach. OpenAttach возвращает указатель на реализацию IAttach , которая предоставляет доступ к свойствам вложений.
Вызовите метод IMAPIProp::GetProps вложения, чтобы получить его свойство PR_ATTACH_METHOD . Дополнительные сведения см. в разделе IMAPIProp::GetProps и PR_ATTACH_METHOD (PidTagAttachMethod).
Если PR_ATTACH_METHOD имеет значение ATTACH_BY_REF_ONLY, вызовите IMAPIProp::GetProps , чтобы получить свойство PR_ATTACH_PATHNAME . Дополнительные сведения см . в разделе PR_ATTACH_PATHNAME (PidTagAttachPathname).
Если PR_ATTACH_METHOD имеет значение ATTACH_BY_VALUE, вызовите IMAPIProp::OpenProperty , чтобы открыть свойство PR_ATTACH_DATA_BIN с интерфейсом IStream . См. пример кода, следующий за этой процедурой. Дополнительные сведения см. в разделе IMAPIProp::OpenProperty and PR_ATTACH_DATA_BIN (PidTagAttachDataBinary).
Если для PR_ATTACH_METHOD задано значение ATTACH_OLE, а вложение представляет собой объект OLE 2:
Вызовите IMAPIProp::OpenProperty , чтобы открыть свойство PR_ATTACH_DATA_OBJ с интерфейсом IStreamDocfile . Попробуйте использовать этот интерфейс, так как это реализация IStream гарантированно работает со структурированным хранилищем с минимальным объемом затрат. Дополнительные сведения см . в разделе PR_ATTACH_DATA_OBJ (PidTagAttachDataObject).
Если вызов OpenProperty завершается ошибкой , вызовите его еще раз, чтобы получить свойство PR_ATTACH_DATA_BIN с интерфейсом IStreamDocfile .
Если этот второй вызов OpenProperty завершается ошибкой, повторите попытку вызова OpenProperty для получения PR_ATTACH_DATA_OBJ. Однако вместо указания IStreamDocfile укажите интерфейс IStorage .
Если 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();
}