Определить, существует ли общая папка (обмена) в Outlook

StackOverflow https://stackoverflow.com/questions/7800262

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top