Определить, если в Outlook существует общая папка (обмена) - PullRequest
0 голосов
/ 18 октября 2011

С помощью следующего кодового блока вы выбираете общую папку, установленную в 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).

Вопрос заключается в том, как избежать этой ошибки, предварительно обнаружив, установлена ​​ли общая папка или нет.

Перехват ошибки с помощью попытка ... наконец-то / кроме блока не сработало , так как исключение вызвано внешне Microsoft API (EOleException).

Я не могу придумать другого способа определить, существует ли папка, поскольку строка, вызывающая ошибку, имеет важное значение при выборе общей папки и, следовательно, получении ее свойств.

greetings

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Почему бы не попробовать / кроме работы?Delphi ловит исключения EOleSysError просто отлично.И исключение выдается Delphi RTL, а не Outlook - все дружественные IDispatch библиотеки возвращают код ошибки, который RTL преобразует в исключение OLE после запроса описания с помощью IErrorInfo.

0 голосов
/ 18 октября 2011

Этот кодовый блок работает просто отлично.Я подумал, что у меня есть еще одна проблема, которую я решил.Спасибо за ваше время.

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.

Ответ Marjan Venemas может пригодиться при работе с несколькими учетными записями в Outlook.

0 голосов
/ 18 октября 2011

Как видно из сообщения, Outlook не знает, какой профиль использовать. Вам нужно войти в пространство имен MAPI, прежде чем вы сможете что-либо с ним сделать. Это необходимо сделать, даже если нет данных для входа, например, когда вы подключаетесь к локальному экземпляру Outlook, который не подключен к серверу Exchange.

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