Получение свойств MAPI
Область применения: Outlook 2013 | Outlook 2016
Когда клиент или поставщик услуг извлекает свойство из объекта, объект предоставляет значение, тип и идентификатор свойства.
Клиенты и поставщики услуг могут получить свойства объекта, вызвав один из следующих вызовов:
Метод GetProps используется для получения одного или нескольких свойств, которым не требуется специализированный или альтернативный интерфейс для доступа. Это означает, что свойства, доступные в GetProps, невелики , например целые числа и логические значения.
Получение нескольких свойств
Выделите структуру SPropTagArray , достаточно большую для хранения количества извлекаемых свойств.
Задайте для элемента cValues структуры SPropTagArray число извлекаемых свойств, а для каждого элемента aulPropTag задайте идентификатор и тип, если это возможно, одного из целевых свойств. Если тип неизвестен, задайте для него значение PT_UNSPECIFIED. Если тип и идентификатор неизвестны, найдите эти сведения, вызвав IMAPIProp::GetPropList. GetPropList возвращает массив тегов свойств со всеми поддерживаемыми свойствами объекта. Если доступно только имя свойства, вызовите IMAPIProp::GetIDsFromNames для доступа к связанному идентификатору.
Вызовите 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 вложения
Вызовите функцию OpenStreamOnFile , чтобы открыть поток для файла.
Вызовите метод IMAPIProp::OpenProperty сообщения, чтобы получить свойство PR_ATTACH_DATA_BIN (PidTagAttachDataBinary) с интерфейсом IStream . Задайте флаги MAPI_MODIFY и MAPI_CREATE.
Выделите структуру STATSTG и передайте ее в вызове метода IStream::Stat файлового потока, чтобы определить ее размер. Другой способ определить размер потока — вызвать IStream::Seek с флагом STREAM_SEEK_END.
Вызовите метод IStream::CopyTo потока, чтобы скопировать данные из потока файла во вложенный поток.
После завершения операции копирования отпустите оба потока, вызвав их методЫ 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 . Безопасные свойства должны быть явно запрошены с использованием идентификаторов свойств.