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


IMAPIProp::OpenProperty

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

Возвращает указатель на интерфейс, который можно использовать для доступа к свойству .

HRESULT OpenProperty(
  ULONG ulPropTag,
  LPCIID lpiid,
  ULONG ulInterfaceOptions,
  ULONG ulFlags,
  LPUNKNOWN FAR * lppUnk
);

Параметры

ulPropTag

[в] Тег свойства для доступа к свойству. Идентификатор и тип должны быть включены в тег свойства.

lpiid

[в] Указатель на идентификатор интерфейса, который будет использоваться для доступа к свойству . Параметр lpiid не должен иметь значение NULL.

ulInterfaceOptions

[в] Данные, связанные с интерфейсом, определяемым параметром lpiid .

ulFlags

[в] Битовая маска флагов, управляющая доступом к свойству. Можно задать следующие флаги:

MAPI_CREATE

Если свойство не существует, оно должно быть создано. Если свойство существует, текущее значение свойства должно быть отменено. Когда вызывающий объект задает флаг MAPI_CREATE, он также должен задать флаг MAPI_MODIFY.

MAPI_DEFERRED_ERRORS

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

MAPI_MODIFY

MAPI_MODIFY требуется в следующих ситуациях:

  • При открытии свойства потока, например IID_IStream, чтобы изменить его.

  • При открытии внедренного вложения сообщения, например PR_ATTACH_DATA_OBJ открыто с помощью IID_IMessage, чтобы изменить его.

lppUnk

[out] Указатель на запрошенный интерфейс, используемый для доступа к свойству.

Возвращаемое значение

S_OK

Запрошенный указатель интерфейса успешно возвращен.

MAPI_E_INTERFACE_NOT_SUPPORTED

Запрошенный интерфейс не поддерживается для этого свойства.

MAPI_E_NO_ACCESS

У вызывающего объекта недостаточно разрешений для доступа к свойству.

MAPI_E_NO_SUPPORT

Объект не может предоставить доступ к этому свойству через запрошенный интерфейс.

MAPI_E_NOT_FOUND

Запрошенное свойство не существует, и MAPI_CREATE не задано в параметре ulFlags .

MAPI_E_INVALID_PARAMETER

Тип свойства в теге имеет значение PT_UNSPECIFIED.

Замечания

Метод IMAPIProp::OpenProperty предоставляет доступ к свойству через определенный интерфейс. OpenProperty является альтернативой методам IMAPIProps::GetProps и IMAPIProp::SetProps . Если getProps или SetProps завершается ошибкой из-за слишком большого или слишком сложного свойства, вызовите OpenProperty. OpenProperty обычно используется для доступа к свойствам типа PT_OBJECT.

Примечания для вызывающих методов

Чтобы получить доступ к вложениям сообщений, откройте свойство PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) с другим идентификатором интерфейса в зависимости от типа вложения. В следующей таблице описано, как вызвать OpenProperty для различных типов вложений:

Тип вложения Идентификатор интерфейса для использования
В двоичном формате
IID_IStream
String
IID_IStream
Сообщение
IID_IMessage
OLE 2.0
IID_IStreamDocfile

IStreamDocfile — это производная от интерфейса IStream , основанная на составном файле OLE 2.0. IStreamDocfile — лучший вариант для доступа к вложениям OLE 2.0, так как он требует наименьшего объема накладных расходов. Вы можете использовать IID_IStreamDocFile для свойств, содержащих данные, хранящиеся в структурированном хранилище, доступном через интерфейс IStorage .

Дополнительные сведения об использовании OpenProperty со вложениями см. в разделе Свойство PR_ATTACH_DATA_OBJ и Открытие вложения.

Не используйте полученный указатель IStream для вызова метода Seek или SetSize , если не используется нулевая позиция или переменная размера. Кроме того, не полагайтесь на значение выходного параметра plibNewPosition , возвращаемого вызовом Seek .

При вызове OpenProperty для доступа к свойству с помощью интерфейса IStream используйте только этот интерфейс, чтобы внести в него изменения. Не пытайтесь обновить свойство с помощью других методов IMAPIProp : IUnknown , таких как SetProps или IMAPIProp::D eleteProps.

Не пытайтесь открыть свойство с помощью OpenProperty более одного раза. Результаты не определены, так как они могут отличаться от поставщика к поставщику.

Если необходимо изменить открытое свойство, установите флаг MAPI_MODIFY. Если вы не уверены, поддерживает ли объект свойство, но считаете нужным, задайте флаги MAPI_CREATE и MAPI_MODIFY. При установке MAPI_CREATE также необходимо задать MAPI_MODIFY.

Вы отвечаете за переадресацию указателя интерфейса, возвращенного в параметре lppUnk , на указатель, соответствующий интерфейсу, указанному в параметре lpiid . Возвращаемый указатель также необходимо использовать для вызова метода IUnknown::Release по завершении работы с ним.

Иногда задания флагов в параметре ulFlags недостаточно, чтобы указать тип доступа к необходимому свойству. Дополнительные данные, например флаги, можно поместить в параметр ulInterfaceOptions . Эти данные зависят от интерфейса. Некоторые интерфейсы (например , IStream) используют его, а другие — нет. Например, при открытии свойства для изменения с помощью IStream задайте флаг STGM_WRITE в параметре ulInterfaceOptions в дополнение к MAPI_MODIFY. При открытии таблицы с помощью интерфейса IMAPITable можно задать для ulInterfaceOptions значение MAPI_UNICODE, чтобы указать, должны ли столбцы таблицы, в которых содержатся строковые свойства, иметь формат Юникода.

Справочные материалы по MFCMAPI

Пример кода MFCMAPI указан в приведенной ниже таблице.

Файл Функция Comment
StreamEditor.cpp
CStreamEditor::ReadTextStreamFromProperty
MFCMAPI использует метод IMAPIProp::OpenProperty для получения интерфейса потока для больших текстовых и двоичных свойств.

См. также