首页 > 解决方案 > Outlook 访问共享日历

问题描述

我正在 Embarcadero Delphi 中构建一个应用程序,其中包括希望从与当前用户共享的 Outlook 日历中读取约会。

我的问题是不了解在文件夹结构中的哪里可以找到这些。

在我的桌面上,我使用连接到 Exchange 服务器的 Outlook 2010(14.0.7188.5002 32 位)。我可以将同事共享的日历添加到 Outlook 中的日历视图:

Outlook 的屏幕截图,名称已编辑

我可以看到有关他们约会的选定信息,主要是他们是免费的还是预订的。正是我的外部工具想知道的。

现在我想通过 Outlook 对象模型访问这些日历。

(对于发布 Delphi 代码,我深表歉意,但它主要是直接进入进口的 TLB,而在其他地方,它就像广告宣传的那样工作)

我试过GetSharedDefaultFolder()这样使用:

Recipient := FOutlook.NameSpace.CreateRecipient('bernie@someplace.com');
Recipient.Resolve;
SharedFolder := FOutlook.Namespace.GetSharedDefaultFolder(Recipient, olFolderCalendar);

但不幸的是,这在调用GetSharedDefaultFolder(). 收件人是正确的,它解决得很好。抛出的错误(作为 Delphi 异常)是:

EOleException - Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden

这翻译回英文为:“无法完成尝试的操作。找不到对象”。

当我选择共享日历时,我将不胜感激有关如何访问 Outlook 在 UI 中向我显示的相同信息的任何输入,仅通过对象模型。

提前感谢您的时间,玛丽安

标签: vbadelphioutlook

解决方案


我因未能展示我的整个代码、真实代码和完整代码而感到内疚。

@nitons 评论,特别是链接答案中的声明,即非共享日历只会显示为空,这促使我玩得更多。

我确实错过了对Recipient.Resolve. 我真正的代码是遍历分发列表的成员,但我认为这并不重要,因为它正在工作。所以实际上我并没有创建一个新的Recipient并解决它,但我有:

for i := 1 to DistList.MemberCount do
  begin
    Recipient := DistList.GetMember(i);
    if not Recipient.Resolved 
      then Recipient.Resolve;
    Folder := FOutlook.NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);
    // ...
  end;

如前所述,这失败了。我拨打了Resolve无条件的电话,但仍然失败。

对我有用的是Recipient从这样返回的那个中创建一个新的DistList.GetMember

Recipient := DistList.GetMember(i);
Recipient := FOutlook.NameSpace.CreateRecipient(Recipient.Address);
Recipient.Resolve;
Folder := FOutlook.NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);

这很好用。用调用来代替对日历的访问也是如此Recipient.FreeBusy

非常感谢 Dmitry 和 niton,你们帮了我很多。


推荐阅读