VSTO Outlook 从约会中检索 TimeZoneStruct

VSTO Outlook Retrieving TimeZoneStruct from Appointment

精简版

我正在尝试使用 VSTO 从 Outlook 约会访问 TimeZoneStruct。 尝试访问它时抛出以下错误。

System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

有趣的是,我能够使用相同的方法得到类似的 属性、TimeZoneDescription,无一例外: http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F

我的代码如下;第一次调用 GetProperty 成功,但第二次调用失败。

//OK returns TimeZone Description string
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F"); 

//NOK throws a COMException
dynamic tzStruct = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102");

长版

我正在开发一个读取 Outlook 日历的插件。

目前的困难在于使用具有不同夏令时设置的不同时区创建的重复约会。

为了查找定期会议系列的所有约会,我需要时区信息。

我使用的第一种方法是通过提取时区名称来获取时区信息。这在大多数情况下有效,但并不理想。

Outlook.PropertyAccessor pa = appointment.PropertyAccessor;
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F");

这个returns一个类似于(UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen的字符串。

这工作正常,但是从使用不同语言的 PC 发送的约会,或者在 "old" 具有 "obsolete" 时区的会议的情况下,在 Windows 更新中被删除,这不太管用。

我将从其他语言的计算机获取会议,例如这个时区是法语,我的计算机将找不到它。 (UTC+03:00) Moscou, Saint-Pétersbourg, Volgograd

还有更新;下面的这个时区不再存在。沃洛格勒于 2016 年在 UTC+04:00 时区内设置了自己的时区。参见 link from Microsoft

显然,匹配时区名称是行不通的。

我专注于使用 TimeZoneStruct 获取完整信息;这应该允许我创建一个自定义 TimeZoneInfo Object;稍后我将能够将其转换为本地时间。

我的问题是尝试访问此结构时出现以下错误: System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

我查看了 OutlookSpy,发现 属性 确实可以访问。

我正在使用 .NET Framework 4.6; 2016年展望; Visual Studio 2015 年; Windows8.1.

有什么建议吗?

更新

我试图在 Outlook Spy 上使用 VBscript 访问此 属性 并遇到类似的错误。 出于某种原因,不是 PT_BINARY 的属性似乎有效。 有什么想法吗?

重复实验的方法如下

使用 OutlookSpy,select 定期约会。 确保你是 selecting master 并在当前 AppointmentItem 上打开 "Current Item" 到 运行 脚本。

输入以下代码。 请参阅屏幕截图以供参考。

set msg = AppointmentItem
set pa = msg.PropertyAccessor

debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82310003")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102")

Outlook 喜欢当老大哥来阻止您修改,有时甚至是访问它认为特殊的某些属性。

使用扩展 MAPI(C++ 或 Delphi)或 Redemption(任何语言,我是它的作者)而不是 OOM 是唯一的解决方法。