0

使用以下代码块,您可以选择在 Outlook 中设置的公用文件夹:

const
  olPublicContactsFolder = $00000012; //constant for the public folder
begin
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root public folder
ContactsRoot := NameSpace.GetDefaultFolder(olPublicContactsFolder); //<-- Error
Contacts:= Contactsroot;

如果 Outlook 中没有公用文件夹(Outlook 中没有设置公用文件夹,没有 Exchange Server),则标记行上会出现错误。

问题是如何通过预先检测是否设置了公用文件夹来避免该错误。

使用 try...finally/except 块捕获错误不起作用,因为异常是由 Microsoft API (EOleException) 从外部引起的。

我想不出另一种方法来检测文件夹是否存在,因为导致错误的行对于选择公用文件夹并因此获取它的属性至关重要。

问候

4

3 回答 3

1

为什么不尝试/除了工作?Delphi 可以很好地捕获 EOleSysError 异常。并且异常是由 Delphi RTL 引发的,而不是 Outlook - 所有 IDispatch 友好的库都返回一个错误代码,RTL 在使用 IErrorInfo 请求描述后将其转换为 OLE 异常。

于 2011-10-17T22:38:01.293 回答
0

如消息所示,Outlook 不知道要使用哪个配置文件。您需要先登录到 MAPI 命名空间,然后才能对其进行任何操作。即使没有登录信息,您也需要执行此操作,例如当您连接到未连接到 Exchange 服务器的本地 Outlook 实例时。

FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
于 2011-10-18T06:20:14.983 回答
0

这个代码块确实工作得很好。我想我有另一个我解决的问题。谢谢你的时间。

function DoesPublicFolderExist():Boolean;
const
  olFolderContacts = $00000012;
var
  Outlook, Namespace, ContactsRoot, Contactsfolder : OleVariant;
begin
  // Connect to outlook
  Outlook := CreateOleObject('Outlook.Application');
  // Get name space
  NameSpace := Outlook.GetNameSpace('MAPI');
  // Get root contacts folder
  try
    ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
    Result:= True;
  except
    Result:= False;
  end;
end;

Dmitry Streblechenko 的回答非常正确,我只是将调试器的 EOleException 误认为是外部异常。在没有调试器的情况下运行代码不会导致异常,因为它确实被 try/exception 块捕获。

在 Outlook 中使用多个帐户时,Marjan Venemas 的回答可能会派上用场。

于 2011-10-18T09:00:59.303 回答