使用以下代码块,您选择了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)在外部引起的。

我想不出其他方法来检测文件夹是否存在,因为导致错误的行对于选择公共文件夹并因此获得属性至关重要。

问候

有帮助吗?

解决方案

为什么不尝试/除了工作? Delphi捕获了Eolesyserror例外情况。并且例外是由Delphi RTL提出的,而不是Outlook-所有IDISPATCH友好的库返回错误代码,RTL在使用IERRORINFO请求说明后将RTL转换为OLE异常。

其他提示

如消息所示,Outlook不知道要使用哪个配置文件。您需要登录MAPI名称空间,然后才能使用它。即使没有登录信息,您也需要执行此操作,例如,当您连接到未连接到Exchange Server的本地Outlook实例时。

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;

Dmitry Streblechenko的回答是完全正确的,我只是误认为调试器的外部调试器。在没有调试器的情况下运行代码不会导致异常,因为它确实被Try/Exception块所捕获。

Marjan Venemas的答案可能会在Outlook中使用多个帐户工作时方便。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top