Короткая версия
Я пытаюсь получить доступ к TimeZoneStruct с помощью VSTO из встречи Outlook.
Следующая ошибка выдается при попытке доступа к нему.
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
.
Это работает правильно, но встречи, отправленные с ПК на разных языках, или в случае "старых" собраний с "устаревшими" часовыми поясами, которые были удалены в Центре обновления Windows, это работает не очень хорошо.
Я буду получать встречи с компьютеров на других языках, например, этот часовой пояс на французском, и мой компьютер не найдет его.
(UTC+03:00) Moscou, Saint-Pétersbourg, Volgograd
Есть также обновления; этот часовой пояс ниже больше не существует. Вологод был введен в свой часовой пояс в UTC + 04: 00 в 2016 году. См. ссылку от 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; Outlook 2016; Visual Studio 2015; Windows 8.1.
Есть предложения?
UPDATE
Я пытаюсь получить доступ к этому свойству с помощью VBscript в Outlook Spy и получаю похожую ошибку.
По некоторым причинам свойства, которые не являются PT_BINARY, работают.
Есть идеи?
вот как повторить эксперимент
Используя 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](https://i.stack.imgur.com/w3tgn.png)