请耐心等待,我的MAPI知识很少,而且我的C++技能基本......
我有一个程序,使用MAPI从Exchange服务器读取所有可能的日历约会.除了一种奇怪的情况外,情况正常.
如果定期约会有大量异常,那么似乎我从MAPI获取的RecurrenceState属性已被截断为1200字节.我可以在OutlookSpy中看到实际上有1400个字节.(奇怪的巧合,两个数字都是100的倍数?)
通过为10个特定属性设置称为SizedSPropTagArray的东西来访问约会,其中一个属性是RecurrenceState,然后执行QueryRows操作.当我访问该属性的Value.bin.cb字段时,它通常是正确的,但是当它应该是1400时,这个特定属性显然包含1200.
希望有人有一个建议 - TIA.
编辑:
德米特里,你说"在你读取属性值之前,你检查类型是否仍然是PT_BINARY?还是变为PT_ERROR?"
我看不出我应该怎么做.我正在做一个QueryRows,一次最多可以达到100个约会.然后我遍历LPSRowSet来处理查询的结果,即最多100个SRow对象.因此,为了处理RecurrenceState,我使用了sRow.lpProps [columnIndex],它提供了一个SPropValue.现在,这里似乎没有任何东西表明返回属性的类型..ulPropTag字段正确包含RecurrenceState属性的id,而.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 ...}
Run Code Online (Sandbox Code Playgroud)
下一个是有许多例外的约会,RecurrenceState数据被截断:
sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01fe l=0x000001fe ul=0x000001fe ...}
Run Code Online (Sandbox Code Playgroud)
请注意.ulPropTag与OK约会相同,数据长度为0x1fe = 510,但我知道它实际上更多.
我想知道,是否可能有一些开关我应该设置表明我想要这种错误的反馈?
或者还有其他我误解的东西?
谢谢.
MAPI表截断大字符串属性.根本不返回大的二进制属性.在读取属性值之前,是否检查类型是否仍为PT_BINARY?或者它被改为PT_ERROR?要打开大型二进制属性,需要打开相应的IMessage并将该属性打开为IStream(IMessage :: OpenProperty).
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |