无法在Outlook VSTO中使用PropertyAccessor设置项目日期时间(作为PT_SYSTIME)
本文关键字:时间 日期 作为 PT SYSTIME 项目 设置 Outlook VSTO PropertyAccessor | 更新日期: 2023-09-27 18:21:24
使用以下代码将Outlook中的日期时间列设置为c#datetime值
documentItem.PropertyAccessor.SetProperty(
"http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/TestDate/0x0000001F",
documentItem.PropertyAccessor.LocalTimeToUTC(DateTime.Now));
将列值转换为PT_APPTIME类型,该类型无法在Outlook表视图中显示、排序等。
我所有将该值设置为PT_SYSTIME的尝试(例如,创建我自己的PROPVARIANT结构Marshal.StructureToPtr…)都失败了,但出现了各种异常。
有没有一种方法可以在不使用兑换库的情况下设置日期时间值,这在这个目的上是过分的?
我不久前也遇到过同样的问题;在对PropertyAccessor
进行了多次尝试和错误之后,我求助于将MailItem
的MAPIOBJECT
属性传递给C++/CLI扩展库项目中的方法,因为这是组合托管对象和非托管头文件(即Outlook 2010 MAPI API头文件)以直接使用MAPI接口设置属性的最简单方法。
我首先使用Marshal::GetIUnknownForObject
从MAPIOBJECT
中获取IUnknown*
指针,然后在其上使用QueryInterface
以及IID_IMessage
和IID_IMAPIProp
ID来获取相应的接口,然后使用IMAPIProp
的GetIDsFromNames
、SetProps
和SaveChanges
来设置属性。
(我从这篇代码项目文章中得到了大致的想法,并根据我的需求进行了调整…)
考虑到Outlook如何处理视图列中的PT_APPTIME
值(即完全无法对它们执行任何操作,而只是显示一个空值),我怀疑PropertyAccessor
关于日期的行为是否可以称为错误;对于这样一个(看似)简单的操作,真的没有必要走那么长的路…:(
TestDate
是用户属性的名称吗?请记住,OOM不理解属性中的类型(0x0000001F
),它将把"TestDate/0x0000001F"
视为属性的名称。
请尝试使用UserProperties.Add
。