【问题标题】:Unable to set item datetime (as PT_SYSTIME) using PropertyAccessor in Outlook VSTO无法在 Outlook VSTO 中使用 PropertyAccessor 设置项目日期时间(作为 PT_SYSTIME)
【发布时间】:2022-04-22 08:07:48
【问题描述】:

使用以下代码将 Outlook 中的日期时间列设置为 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、...)都失败了,但出现了各种异常。

有没有办法在不使用赎回库的情况下设置日期时间值,这对于这个目的来说太过分了?

【问题讨论】:

    标签: c# outlook vsto outlook-addin


    【解决方案1】:

    我前段时间也遇到过同样的问题;在对PropertyAccessor 进行多次试验和错误之后,我求助于将MailItemMAPIOBJECT 属性传递给C++/CLI 扩展库项目中的一个方法,因为这是组合托管对象和非托管头文件的最简单方法(即 Outlook 2010 MAPI API 标头)直接使用 MAPI 接口设置属性。

    我首先使用Marshal::GetIUnknownForObjectMAPIOBJECT 中获取IUnknown* 指针,然后在其上使用QueryInterfaceIID_IMessageIID_IMAPIProp id 来获取各自的接口,然后使用@987654331 @的GetIDsFromNamesSetPropsSaveChanges来设置属性。

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

    考虑到 Outlook 如何处理视图列中的 PT_APPTIME 值(即完全无法对它们执行任何操作,而只是显示一个空白值),我怀疑与日期有关的 PropertyAccessor 行为可以称为其他任何东西而不是一个错误;对于这样一个(看似)简单的操作,真的没有必要花那么大的力气...... :(

    【讨论】:

    • 经过多年尝试不同的方法,这似乎是使用 PropertyAccessor 存储日期类型 (PT_SYSTIME) 的唯一方法。谢谢!
    • 我切换到了 Redemption 库。
    【解决方案2】:

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

    尝试改用UserProperties.Add

    【讨论】:

    • 如 MSDN (msdn.microsoft.com/query/…) 中所述:即使 olWordDocumentItem 是 OlItemType 枚举中的有效常量,不能将用户定义的字段添加到 DocumentItem 对象,当您尝试以编程方式将用户定义的字段添加到 DocumentItem 对象时,您将收到错误消息。
    猜你喜欢
    • 2016-06-03
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多