Outlook Access共享日历

时间:2018-06-22 09:38:54

标签: delphi outlook outlook-vba

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

我的问题是缺乏对在文件夹结构中找到这些位置的了解。

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

Screenshot from Outlook, names redacted

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

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

(我为发布Delphi代码而道歉,但主要是直接转到导入的TLB,而在其他地方,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中向我显示有关如何访问相同信息的任何输入,

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

1 个答案:

答案 0 :(得分:0)

我没有显示完整的代码,真实的代码和完整的代码,我深感内

@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,您对我有很大帮助。