VSTO Outlook从约会中检索TimeZoneStruct

问题描述 投票:1回答:1

精简版

我试图从Outlook约会使用VSTO访问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");

这将返回类似于(UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen的字符串。

这可以正常工作,但是使用不同语言从PC发送的约会,或者在“旧”会议中使用在Windows Update中删除的“过时”时区的情况下,这种方法效果不佳。

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

还有更新;下面这个时区不再存在。 Volograd在2016年UTC + 04:00进入了自己的时区。见link from Microsoft

  • 老:(UTC+03:00) Moscow, St. Petersburg, Volgograd
  • 新:(UTC+03:00) Moscow, St. Petersburg

显然,匹配时区名称永远不会起作用。

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

我的问题是,当试图访问此结构时,我收到以下错误: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; Windows 8.1。

有什么建议?

UPDATE

我试图在Outlook Spy上使用VBscript访问此属性并获得类似的错误。由于某些原因,非PT_BINARY的属性似乎有效。有任何想法吗?

here's how to repeat the experiment

使用OutlookSpy,选择定期约会。确保选择主服务器并打开“当前项”以在当前AppointmentItem上运行脚本。

输入以下代码。查看截图以供参考。

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")

Trying to obtain property with OutlookSpy

c# outlook timezone vsto outlook-addin
1个回答
1
投票

Outlook喜欢扮演老大哥,以防止你修改或有时甚至访问它认为特殊的一些属性。

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

© www.soinside.com 2019 - 2024. All rights reserved.