我正在Embarcadero Delphi中构建一个应用程序,该应用程序除其他外还希望从与当前用户共享的Outlook日历中读取约会。
我的问题是缺乏对在文件夹结构中找到这些位置的了解。
在我的桌面上,我使用连接到交换服务器的Outlook 2010(14.0.7188.5002 32位)。我可以将同事共享的日历添加到Outlook中的日历视图中:
我可以查看有关他们约会的选定信息,主要是他们是免费的还是已预订的信息。正是我的外部工具想知道的。
现在,我想通过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中向我显示有关如何访问相同信息的任何输入,
提前感谢您的时间, 玛丽安
答案 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,您对我有很大帮助。