2011-10-17 54 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答案可能會很方便。

相關問題