Свойство MAPI усекается при доступе с помощью QueryRows - PullRequest
2 голосов
/ 23 июня 2011

Пожалуйста, потерпите меня, мои знания MAPI минимальны, а мои навыки C ++ зачаты ...

У меня есть программа, которая читает все возможные встречи в календаре с сервера Exchange, используя MAPI. Все работает хорошо, за исключением одной странной ситуации.

Если повторяющаяся встреча имеет большое количество исключений, то создается впечатление, что свойство RecurrenceState, которое я получаю из MAPI, было усечено до 1200 байтов. Я вижу в OutlookSpy, что на самом деле 1400 байтов. (Странное совпадение, оба числа кратны 100?)

Доступ к назначениям можно получить, настроив так называемый SizedSPropTagArray для 10 конкретных свойств, одним из которых является RecurrenceState, а затем выполнив операцию QueryRows. Когда я получаю доступ к полю Value.bin.cb для этого свойства, оно обычно корректно, но, очевидно, содержит 1200 для этого конкретного свойства, когда оно должно быть 1400.

Надеюсь, у кого-то есть предложение - TIA.

EDIT:

Дмитрий, вы говорите: «Прежде чем читать значение свойства, проверяете ли вы, что тип по-прежнему PT_BINARY? Или он изменяется на PT_ERROR?»

Я не понимаю, как мне это сделать. Я делаю QueryRows, чтобы получить до 100 встреч одновременно. Затем я перебираю LPSRowSet для обработки результатов запроса, т. Е. До 100 объектов SRow. Поэтому для обработки RecurrenceState я использую sRow.lpProps [columnIndex], который предоставляет SPropValue. Теперь здесь нет ничего, что указывало бы на тип возвращаемого свойства. Поле .ulPropTag правильно содержит идентификатор свойства RecurrenceState, а .Value.bin.cb предоставляет длину, обычно правильную, но когда данные очень длинные, это более низкое значение. Что я должен тестировать, чтобы увидеть, произошла ли ошибка, которую вы описываете? Спасибо.

РЕДАКТИРОВАТЬ 2:

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

Теперь я могу воспроизвести ситуацию на нашем собственном сервере Exchange, единственное отличие состоит в том, что для нашего сервера Exchange ограничение для данных RecurrenceState составляет, по-видимому, 510 байт вместо 1200 байт, как видно при установке нашего клиента.

Ниже приведены некоторые операции копирования и вставки данных в программе при работе в отладчике Visual Studio. Первый из обычных повторяющихся встреч, чьи данные об исключениях не усекаются:

   sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
   sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01da l=0x000001da ul=0x000001da ...}

Следующее предназначено для встречи, которая имеет так много исключений, что данные RecurrenceState усекаются:

   sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
   sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01fe l=0x000001fe ul=0x000001fe ...}

Обратите внимание, что .ulPropTag идентична назначению OK, а длина данных составляет 0x1fe = 510, хотя я знаю, что на самом деле это больше.

Мне интересно, есть ли какой-то переключатель, который я должен установить, чтобы указать, что я хочу получить отзыв об этом виде ошибки?

Или есть что-то еще, что я неправильно понял?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 23 июня 2011

Таблицы MAPI усекают свойства больших строк. Большие двоичные свойства не возвращаются вообще. Прежде чем читать значение свойства, проверяете ли вы, что тип по-прежнему PT_BINARY? Или это изменяется на PT_ERROR? Чтобы открыть большие двоичные свойства, вам необходимо открыть соответствующее IMessage и открыть свойство как IStream (IMessage :: OpenProperty).

1 голос
/ 16 июля 2014

Я бы посоветовал взглянуть на http://mfcmapi.codeplex.com/ Стивена Гриффина, который содержит полный исходный код - вы можете использовать приложение mfcmapi для просмотра требуемого свойства pst / folder / message /, а затем просмотреть код, чтобы увидеть требуемые вызовы MAPI .

...