2011-10-17 35 views
0

存在用下面的代码块,你选择哪一个是在Outlook中设置公用文件夹:检测是否(交换)公用文件夹在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)。

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

捕获错误试试... finally/except块不起作用由于异常是由Microsoft API(EOleException)在外部引起的。

我不能想到另一种方式来检测文件夹是否存在,因为导致错误的行是必不可少的选择公共文件夹,因此获得它的属性。

问候

回答

1

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

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); 
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; 

梅德Streblechenko与他的回答完全正确,我只是错把调试器的EOleException对外部之一。在没有调试器的情况下运行代码不会导致异常,因为它确实被try/exception块捕获。

在Outlook中处理多个帐户时,Marjan Venemas答案可能会很方便。

相关问题