使用QueryRows访问时,MAPI属性被截断

时间:2011-06-23 14:16:28

标签: mapi

请耐心等待,我的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 ...}

下一个是约会,有很多例外,RecurrenceState数据被截断:

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

请注意.ulPropTag与OK约会相同,数据长度为0x1fe = 510,但我知道它实际上更多。

我想知道,是否可能有一些开关我应该设置表明我想要这种错误的反馈?

或者还有其他我误解的东西?

感谢。

2 个答案:

答案 0 :(得分:5)

MAPI表会截断大字符串属性。根本不返回大的二进制属性。 在读取属性值之前,是否检查类型是否仍为PT_BINARY?或者它被改为PT_ERROR? 要打开大型二进制属性,您需要打开相应的IMessage并将该属性打开为IStream(IMessage :: OpenProperty)。

答案 1 :(得分:1)

我会考虑查看包含完整源代码的Stephen Griffin的http://mfcmapi.codeplex.com/ - 您可以使用mfcmapi应用程序查看所需的pst / folder / message /属性,然后查看代码以查看所需的MAPI调用。