2016-02-13 3 views
1

Есть ли способ использовать код для определения того, будет ли Outlook автоматически захватывать существующий экземпляр Outlook, а не запускать новый экземпляр Outlook? (Предпочтительно код VBA.) В идеале также можно было бы включить/выключить это поведение программно.Обнаружение состояния Outlook/повторного использования и запуск нескольких экземпляров Outlook

Задача здесь - запустить несколько процессов одновременно с данными в одном наборе учетных записей 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. Удаление коммутатора должно предотвращать поведение и разрешать создание нескольких экземпляров Outlook. Однако установки Outlook 2010 (на хосте Vista64) и Outlook 2013 (на хосте Windows 10) ведут себя так, как если бы был переключатель/recycle, хотя их ярлыки запуска Outlook не включают любой аргумент/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, поэтому многопоточность на самом деле невозможна.

Чтобы запустить несколько потоков/процессов, вам необходимо использовать Extended MAPI (C++ или Delphi), который представляет собой набор DLL, загружаемых отдельно в каждый процесс. Вы также можете использовать CDO 1.21 (больше не поддерживается Microsoft) или Redemption - оба из них являются оболочками поверх расширенного MAPi и могут использоваться из нескольких потоков/процессов.

+0

Спасибо, Димитрий. Я посмотрю на CDO, с которым я не сталкивался раньше. Я посмотрел на Redemption, и это выглядело довольно большим сюитом для моих нужд. –

+0

[Состояние Microsoft] (https://support.microsoft.com/en-us/kb/2028411), что самый последний CDO 1.2.1 может быть установлен только в том случае, если Outlook 2007 установлен ** и **, что, в то время как он может использоваться с более поздней версией Outlook, если вы затем обновляете, это использование устарело, поскольку большинство функций теперь доступны в более новых версиях Outlook. Как вы говорите, Димитрий, похоже, что единственный способ получить функциональность - использовать Extended MAPI прямо или косвенно. Наверное, мне нужно найти другой способ достижения моих целей. Спасибо Димитрию Стреблеченко. –

1

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

Смежные вопросы