检测Outlook /回收状态并运行多个Outlook实例

时间:2016-02-13 15:50:52

标签: outlook outlook-vba

有没有办法使用代码来检测Outlook是否会自动获取现有的Outlook实例而不是启动新的Outlook实例? (最好是VBA代码。)理想情况下,还有一种以编程方式打开/关闭此行为的方法。

此处的目标是同时针对一组Outlook帐户中的数据运行多个进程,因为某些Outlook进程可能需要很长时间。然后可以使用一个实例继续长持续时间进程,而在另一个实例中开始并完成其他短持续时间进程当然,需要注意确保进程使用正确的Outlook实例,并且一个实例所做的更改不会影响另一个实例的行为。

默认情况下,启动Outlook 2013或2010时,它们会自动启动,以确保只运行一个Outlook实例。即使您使用如下VBA代码也是如此:
Set appOl = CreateObject(Class:="Outlook.Application")

根据http://amal.net/?p=2190(2009)和http://www.nextofwindows.com/opening-multiple-instances-of-outlook-on-windows(不确定日期)等帖子,在安装Outlook时创建的默认Outlook启动快捷方式中使用/ recycle开关来指定此行为。删除交换机应该可以防止该行为,并允许创建多个Outlook实例。但是,Outlook 2010(在Vista64主机上)和Outlook 2013(在Windows 10主机上)的安装都表现得好像/ recycle开关一样,即使他们的Outlook启动快捷方式 包括任何/回收参数。

考虑到一种检测并希望改变Outlook行为方式的方法,这样的代码可用于在启动长时间运行的进程时创建其他Outlook实例,并在完成时退出新的Outlook实例:

'       Detect whether a New Outlook instance can be created &
'         set the value of NewOutlookInstanceIsPossible to True/False
    If NewOutlookInstanceIsPossible Then
        Set appOl  = VBA.CreateObject(Class:="Outlook.application") 'New instance
    End If
'   ....     Code that does something using AppOl
    If NewOutlookInstanceIsPossible Then appOl.Quit                 'Quit new instance`

2 个答案:

答案 0 :(得分:3)

Outlook是一个单身人士。它始终只为每个登录用户运行一个实例。还要记住,所有对Outlook对象模型的调用都被封送到主要的Outlook线程,因此实际上不可能进行多线程处理。

要运行多个线程/进程,您需要使用扩展MAPI(C ++或Delphi),这是一组在每个进程中单独加载的dll。您还可以使用CDO 1.21(不再受Microsoft支持)或Redemption - 它们都是扩展MAPi之上的包装器,可以在多个线程/进程中使用。

答案 1 :(得分:1)

这里简短的回答是:如果可能,请不要在Outlook上运行多个线程。如果您必须这样做,请使用扩展MAPI。这可能需要购买Redemption之类的东西或替代品(如果存在的话)。