Пожалуйста, потерпите меня, мои знания 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, хотя я знаю, что на самом деле это больше.
Мне интересно, есть ли какой-то переключатель, который я должен установить, чтобы указать, что я хочу получить отзыв об этом виде ошибки?
Или есть что-то еще, что я неправильно понял?
Спасибо.