无法使用Outlook VSTO中的PropertyAccessor设置项目日期时间(作为PT_SYSTIME)

时间:2015-11-10 12:24:00

标签: c# outlook vsto outlook-addin

使用以下代码将Outlook中的datetime列设置为c#DateTime值

documentItem.PropertyAccessor.SetProperty(
    "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/TestDate/0x0000001F",
    documentItem.PropertyAccessor.LocalTimeToUTC(DateTime.Now));

将columnvalue转换为PT_APPTIME类型,不能在Outlook-Tableview中显示,排序等。

我尝试将值设置为PT_SYSTIME(例如,创建我自己的PROPVARIANT结构,Marshal.StructureToPtr,...)失败,但有各种例外。

有没有办法在不使用兑换库的情况下设置日期时间值,这对于此目的来说是否过度?

2 个答案:

答案 0 :(得分:0)

TestDate是用户属性的名称吗?请记住,OOM不理解属性中的类型(0x0000001F),它会将“TestDate / 0x0000001F”视为属性的名称。

尝试使用UserProperties.Add。

答案 1 :(得分:0)

我前段时间遇到过同样的问题;经过PropertyAccessor MAPIOBJECT的大量试验和错误后,我已经将MailItem的{​​{1}}属性传递给C ++ / CLI扩展库项目中的方法,因为它'最简单的方法是将托管对象和非托管头文件(即Outlook 2010 MAPI API头文件)组合在一起,直接使用MAPI接口设置属性。

我首先使用Marshal::GetIUnknownForObjectIUnknown*获取MAPIOBJECT指针,然后在QueryInterfaceIID_IMessage上使用IID_IMAPIProp用于获取相应界面的ID,然后使用IMAPIProp GetIDsFromNamesSetPropsSaveChanges来设置属性。

(我从this codeproject article得到了一般性的想法,并根据我的需要进行了调整......)

考虑Outlook如何处理视图列中的PT_APPTIME值(即完全无法对它们执行任何操作而只是显示空值)我怀疑PropertyAccessor关于日期的行为可能被称为除了bug之外的任何东西;对于这样一个(看似简单的)简单的操作来说,真的不应该这么做...... :(