Как определить, имеет ли пользователь доступ к процессу Outlook, который я запустил? - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть приложение на C #, в котором я получаю доступ к Outlook через Office PIA для анализа встреч. В моем приложении, когда я создаю свой объект внешнего вида, в диспетчере задач создается новый процесс внешнего вида. Когда я закрываю свое приложение, я также закрываю объект outlook. Это закрывает процесс Outlook в моем диспетчере задач.

Моя проблема, когда пользователь также взаимодействует с внешним видом. В частности, если пользователь открыл Outlook, когда моя программа закрывается, моя программа также закрывает программу Outlook этого пользователя. Экспериментируя с открытием внешнего вида как вручную, так и с моей программой, наблюдая за диспетчером задач, кажется, что одновременно может быть запущен только один экземпляр внешнего вида, и пользователь и моя программа получают доступ к этому же экземпляру, поэтому, когда закрыть вид из моей программы, я также закрыл программу пользователя.

Как ни странно, обратное не так. Если пользователь закрывает outlook во время работы моей программы, его окно исчезнет, ​​но процесс outlook не выключится, и моя программа все еще может продолжиться. Это как если бы окно было только клиентом процесса outlook, хотя для окна нет отдельного процесса. Могу ли я узнать, является ли моя программа единственной, использующей процесс outlook, или открыты ли какие-либо "клиенты окна пользователя", чтобы я мог избежать закрытия outlook, когда он все еще используется?

1 Ответ

2 голосов
/ 15 марта 2011

Я нашел решение сам.Я выясняю, что Outlook отслеживает, сколько исследователей открыто на нем.Достижение нулевого уровня не приводит к остановке процесса, но указывает на то, что ни у одного пользователя нет нормального открытого окна перспективы, поэтому процесс можно безопасно отключить.В моем проекте у меня есть один класс, который имеет доступ к мировоззрению.Мое решение состоит в том, чтобы проверить нулевые исследователи в деструкторе этого класса (следующий код предполагает "использование Outlook = Microsoft.Office.Interop.Outlook;"):

~OutlookAccessor()
{
    try
    {
        Outlook.Application app = new Outlook.Application();
        if (app.Explorers.Count == 0)
        {
            ((Outlook._Application)app).Quit();
        }
        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    }
    catch (System.Runtime.InteropServices.COMException)
    {
        ; // nevermind, we're only trying to free the Outlook COM object, and the most probable cause for this exception is that office is not installed.
    }
}

.осторожно закройте всех исследователей, которые вы используете в своем коде, иначе решение не будет работать, например:

private void AccessOutlook(Outlook.MAPIFolder topfolder)
{
    Outlook.Explorer explorer = null;
    try
    {
        explorer = topFolder.GetExplorer();
        ... // do stuff with the explorer
    }
    finally
    {
        if (explorer != null)
        {
            ((Outlook._Explorer)explorer).Close();
        }
    }
}
...