【问题标题】:Detect if public folder (of exchange) exists in Outlook检测 Outlook 中是否存在(交换的)公用文件夹
【发布时间】:2011-10-18 17:00:59
【问题描述】:

使用以下代码块,您可以选择在 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) 从外部引起的。

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

问候

【问题讨论】:

    标签: delphi outlook exchange-server public-folders


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      FNameSpace := FOutlook.GetNamespace('MAPI');
      FNameSpace.Logon('', '', False, False);
      Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
      Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
      

      【讨论】:

        【解决方案3】:

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

        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 的回答可能会派上用场。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-13
          • 2011-04-13
          • 2011-05-25
          • 2011-03-27
          • 2019-04-21
          • 1970-01-01
          • 2012-02-05
          • 1970-01-01
          相关资源
          最近更新 更多