2016-02-13 80 views
1

有沒有辦法使用代碼來檢測Outlook是否會自動獲取現有的Outlook實例而不是啓動新的Outlook實例? (最好是VBA代碼。)理想情況下,還會有一種以編程方式打開/關閉此行爲的方式。檢測Outlook /回收狀態並運行Outlook的多個實例

這裏的目標是針對一組Outlook帳戶中的數據同時運行多個進程,因爲某些Outlook進程可能需要很長時間。然後持續時間較長的進程可以繼續使用一個實例,而其他持續時間較短的進程可以在另一個進程中啓動並完成。當然,需要注意確保流程使用正確的Outlook實例,並且一個實例所做的更改不會影響另一個實例的行爲。

默認情況下,啓動Outlook 2013或2010時,它們會自動啓動,以確保只有一個Outlook實例運行。
Set appOl = CreateObject(Class:="Outlook.Application")

根據像http://amal.net/?p=2190(2009年)和http://www.nextofwindows.com/opening-multiple-instances-of-outlook-on-windows(不確定的日期)是由默認的Outlook啓動使用/循環開關指定此行爲的帖子:即使您使用VBA代碼,這樣這是真的在安裝Outlook時創建的快捷方式。刪除交換機應防止行爲並允許創建多個Outlook實例。但是,儘管Outlook啓動快捷方式不包含包含任何/ recycle參數,但安裝的Outlook 2010(在Vista64主機上)和Outlook 2013(在Windows 10主機上)的行爲就像存在/ recycle交換機一樣。

給出一種檢測並希望改變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` 

回答

1

Outlook是單身人士。它總是每個登錄用戶只運行一個實例。另外請記住,所有對Outlook對象模型的調用都封送到主Outlook線程,所以多線程並不是真的可行。

要運行多個線程/進程,您需要使用擴展MAPI(C++或Delphi),這是一組獨立加載到每個進程中的dll。您也可以使用CDO 1.21(不再受Microsoft支持)或Redemption - 它們都是擴展MAPi之上的包裝,可用於多個線程/進程。

+0

謝謝,迪米特里。我會看看我以前沒有遇到過的CDO。我看着Redemption,它看起來是一個相當大的套件,可以滿足我的需求。 –

+0

[Microsoft state](https://support.microsoft.com/en-us/kb/2028411)如果當前安裝了Outlook 2007,則只能安裝最新的CDO 1.2.1 **和**,而如果您隨後進行升級,則可以與Outlook的更高版本一起使用,因爲大多數功能現在可用於較新的Outlook版本,因此不推薦使用此用法。正如您所說,Dimitry,似乎獲得該功能的唯一方法是直接或間接使用Extended MAPI。也許,我需要找到另一種達到目標的方式。感謝Dimitry Streblechencko。 –

1

這裏的簡短答案是:如果可能,請不要在Outlook上運行多個線程。如果您絕對必須這樣做,請使用Extended MAPI。這可能需要購買諸如Redemption之類的東西或者替代品(如果存在的話)。