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


Получение свойств MAPI

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

Когда клиент или поставщик услуг извлекает свойство из объекта, объект предоставляет значение, тип и идентификатор свойства.

Клиенты и поставщики услуг могут получить свойства объекта, вызвав один из следующих вызовов:

IMAPIProp::GetProps

IMAPIProp::OpenProperty

HrGetOneProp

Метод GetProps используется для получения одного или нескольких свойств, которым не требуется специализированный или альтернативный интерфейс для доступа. Это означает, что свойства, доступные в GetProps, невелики , например целые числа и логические значения.

Получение нескольких свойств

  1. Выделите структуру SPropTagArray , достаточно большую для хранения количества извлекаемых свойств.

  2. Задайте для элемента cValues структуры SPropTagArray число извлекаемых свойств, а для каждого элемента aulPropTag задайте идентификатор и тип, если это возможно, одного из целевых свойств. Если тип неизвестен, задайте для него значение PT_UNSPECIFIED. Если тип и идентификатор неизвестны, найдите эти сведения, вызвав IMAPIProp::GetPropList. GetPropList возвращает массив тегов свойств со всеми поддерживаемыми свойствами объекта. Если доступно только имя свойства, вызовите IMAPIProp::GetIDsFromNames для доступа к связанному идентификатору.

  3. Вызовите IMAPIProp::GetProps , чтобы открыть свойство или свойства.

Метод OpenProperty используется для открытия больших свойств, для доступа к которым требуется альтернативный интерфейс , например IStream или IMAPITable . OpenProperty обычно используется для открытия строковых, двоичных и объектных свойств большого размера и может открывать только одно свойство за раз. Вызывающие передают идентификатор дополнительного интерфейса, необходимого в качестве одного из входных параметров.

Некоторые распространенные способы использования OpenProperty включают открытие PR_BODY (PidTagBody), свойство, которое содержит текст текстового сообщения, PR_ATTACH_DATA_OBJ (PidTagAttachDataObject), свойство, которое содержит объект OLE или вложение сообщения, и PR_CONTAINER_CONTENTS (PidTagContainerContents), свойство, которое содержит таблицу содержимого контейнера папки или адресной книги.

В зависимости от свойства у OpenProperty запрашивается другой интерфейс. Интерфейс IStream, который позволяет считывать и записывать данные свойств в виде потока байтов, обычно используется для доступа к PR_BODY. Для доступа к PR_ATTACH_DATA_OBJ можно использовать IMessage или IStream. Внедренные вложения сообщений, которые являются стандартными, используют IMessage , а сообщения в формате TNEF — IStream. Так как PR_CONTAINER_CONTENTS является объектом таблицы, доступ к нему осуществляется с помощью IMAPITable.

Получение свойства PR_ATTACH_DATA_BIN вложения

  1. Вызовите функцию OpenStreamOnFile , чтобы открыть поток для файла.

  2. Вызовите метод IMAPIProp::OpenProperty сообщения, чтобы получить свойство PR_ATTACH_DATA_BIN (PidTagAttachDataBinary) с интерфейсом IStream . Задайте флаги MAPI_MODIFY и MAPI_CREATE.

  3. Выделите структуру STATSTG и передайте ее в вызове метода IStream::Stat файлового потока, чтобы определить ее размер. Другой способ определить размер потока — вызвать IStream::Seek с флагом STREAM_SEEK_END.

  4. Вызовите метод IStream::CopyTo потока, чтобы скопировать данные из потока файла во вложенный поток.

  5. После завершения операции копирования отпустите оба потока, вызвав их методЫ IUnknown::Release .

Если IStream используется для доступа к свойствам, некоторые поставщики услуг автоматически отправляют размер свойства обратно с потоком. Вызов OpenProperty с флагом MAPI_DEFERRED_ERRORS может задержать открытие свойства и возврат размера потока. Если вызывается IStream::Stat для получения этого размера после OpenProperty с установленным флагом MAPI_DEFERRED_ERRORS, производительность будет затронута, так как эта последовательность вызовов вызывает дополнительный удаленный вызов процедуры. Чтобы избежать снижения производительности, клиенты могут вызывать любой метод MAPI между вызовами OpenProperty и Stat.

Функция HrGetOneProp , например OpenProperty, открывает одно свойство за раз. HrGetOneProp следует использовать только в том случае, если целевой объект существует на локальном компьютере. Если целевой объект недоступен локально, многократное использование HrGetOneProp может привести к нескольким удаленным вызовам процедур и снижению производительности.

Вызывающие объекты, которым требуется несколько свойств, могут вызвать HrGetOneProp или OpenProperty в цикле или выполнить один вызов GetProps. Вызов GetProps один раз является более эффективным.

Примечание.

Защищенные свойства не доступны автоматически с другими свойствами в вызове GetProps, HrGetOneProp или GetPropList . Безопасные свойства должны быть явно запрошены с использованием идентификаторов свойств.

См. также

Обзор свойств MAPI