Определить, существует ли общая папка (обмена) в Outlook
-
22-10-2019 - |
Вопрос
С помощью следующего блока кода вы выбираете общую папку, установленную в 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/кроме не сработал поскольку исключение вызвано внешним API Microsoft (EOleException).
Я не могу придумать другого способа определить, существует ли папка, поскольку строка, вызывающая ошибку, важна для выбора общей папки и, следовательно, получения ее свойств.
привет
Решение
Почему бы не попробовать/кроме работы?Delphi прекрасно улавливает исключения EOleSysError.И исключение вызывается RTL Delphi, а не Outlook — все библиотеки, поддерживающие IDispatch, возвращают код ошибки, который RTL преобразует в исключение OLE после запроса описания с помощью IErrorInfo.
Другие советы
Как следует из сообщения, Outlook не знает, какой профиль использовать.Вам необходимо войти в пространство имен MAPI, прежде чем вы сможете что-либо с ним делать.Это необходимо сделать, даже если данные для входа отсутствуют, например, при подключении к локальному экземпляру Outlook, который не подключен к серверу Exchange.
FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
Этот кодовый блок работает нормально.Я подумал, что у меня есть еще одна проблема, которую я решил.Спасибо за ваше время.
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;
Дмитрий Стреблеченко был совершенно прав в своем ответе, я просто принял EOleException отладчика за внешнее.Запуск кода без отладчика не приводит к исключению, поскольку оно действительно перехватывается блоком try/Exception.
Ответ Марьяна Венемаса может пригодиться при работе с несколькими учетными записями в Outlook.