VSTO Outlook 从约会中检索 TimeZoneStruct

Posted

技术标签:

【中文标题】VSTO Outlook 从约会中检索 TimeZoneStruct【英文标题】:VSTO Outlook Retrieving TimeZoneStruct from Appointment 【发布时间】:2019-03-13 05:51:51 【问题描述】:

短版

我正在尝试使用 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 更新中删除了“过时”时区的“旧”会议的情况下,这不能很好地工作。

我将通过其他语言的计算机获取会议,例如,这个时区是法语,我的计算机找不到它。 (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;视觉工作室 2015; Windows 8.1。

有什么建议吗?

更新

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

这是重复实验的方法

使用 OutlookSpy,选择一个定期约会。 确保您选择了 master 并打开“Current Item”以在当前 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")

【问题讨论】:

Google Err.exe 它奇怪地是作为一个 Exchange 实用程序出现的。将它放在您的 System32 文件夹或环境变量中的任何路径中(这样您就不需要 CD 到目录)。接下来发出这个命令err 0x80040102 - 现在应该让你更接近根本原因。这可能很简单,但日期时间转换很棘手,祝你好运! 嗨@JeremyThompson。谢谢你的提示。看起来它返回“MAPI_E_NO_SUPPORT”。我会再查一下。 @JeremyThompson - 我试过你的工具,但似乎无法获得更多信息;该错误非常笼统。我已经尝试使用 OutlookSpy 通过 VBscript 获取数据,但我遇到了同样的问题(请参阅上面的更新屏幕截图)。您可能知道的任何参考资料? 能否请您发一个minimal reproducible example 这很复杂。我们需要在调试器中重现该问题,以提供正确和高质量的建议。 你好@JeremyThompson - 你是对的。我已在有关如何重现 OutlookSpy 问题的问题的“更新”部分中发布了说明。感谢您的帮助。 【参考方案1】:

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

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

【讨论】:

感谢您提供的信息 - 这确实是问题所在。赎回库非常强大。这让我走上了正轨。我目前正在尝试使用 PInvoke 访问该方法。一位名叫 Helmut Obertanner 的开发人员也提供了一个非常强大的代码示例:outlookcode.com/codedetail.aspx?id=1112

以上是关于VSTO Outlook 从约会中检索 TimeZoneStruct的主要内容,如果未能解决你的问题,请参考以下文章

VSTO Outlook 约会事件 (VB.NET)

Outlook VSTO - 当我调用约会.Display() 时如何显示“邀请与会者”文本框?

VSTO Outlook 插件:当用户拖放定期约会时,无法在 Item_Change 事件中获取 AppointmentItem

Outlook 约会替换表单区域的功能区页面已禁用

如何从 VSTO 插件中找出当前版本的 Outlook?

VSTO - Outlook 如何从邮件 ID 跟踪电子邮件