Microsoft Outlook не закрывается после завершения автоматизации (C ++ -> C # -> Outlook) через COM - PullRequest
1 голос
/ 06 мая 2019

Это моя оболочка Visual C ++, которая инициализирует собственную библиотеку DLL:

void COutlookManagerEx::Init()
{
    throw_if_fail(m_pInterface.CreateInstance(__uuidof(PTSOutlookLibrary::PTSOutlookLibraryClass)));
    if (IsValid())
        m_pInterface->ShowMicrosoftOutlook();
}

Конструктор C #:

public PTSOutlookLibraryClass()
{
    try
    {
        _OutlookApp = new Outlook.Application();
    }
    catch(Exception /* e */)
    {

    }
}

Метод C # для отображения Outlook:

public void ShowMicrosoftOutlook()
{
    // Show Outlook
    if (_OutlookApp.Explorers.Count == 0)
    {
        Outlook.MAPIFolder oFolder = _OutlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        oFolder.Display();
    }
}

My COutlookManagerEx является переменной-членом CDialog:

private:
    COutlookManagerEx m_OutlookManager;

По какой-то причине, когда я закрываю свой объект CDialog, Microsoft Outlook остается открытым.

Обновление

На основе похожих вопросов Я попытался:

   public void Terminate()
    {
        try
        {
            Marshal.ReleaseComObject(_OutlookApp);
        }
        catch
        {

        }
        finally
        {
            _OutlookApp = null;
        }
    }

И добавив свою собственную обертку, а затем вызвав Terminate, когда мой диалогзакрывается, но Outlook все еще виден.

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Запускаете ли вы какие-либо макросы VBA в Outlook при его создании?VBA вариант для вас?Я делаю автоматизацию в Excel в фоновом режиме, и я обнаружил, что я получаю наиболее надежные результаты, когда создаю экземпляр программы с помощью VB Script и затем выполняю VBA либо изнутри Excel, либо через интерфейс VB Script.Таким образом, я могу запускать VBS-скрипт в фоновом режиме и использовать команды VBA, такие как DisplayAlerts и Quit , чтобы скрыть что-либо или выйти из программы.Я также могу обойти проблемы с доступом пользователей, используя хранилище учетных данных и выполняя VBS как пользователь с необходимыми разрешениями для доступа к файлам (так как VBS запустит COM-объект с учетными данными, предоставленными в свое время выполнения.)

Но какую бы оболочку вы ни выбрали, вам следует отправить команду quit на outlook, прежде чем закрыть COM-объект.Я обнаружил, что если я не выйду из Excel сначала , а затем закрою COM-объект, есть вероятность, что программное обеспечение просто останется открытым, особенно если оно ожидает какого-либо пользовательского ввода (IE: "Вы уверены, что хотите выйти?").И, конечно же, на другом конце спектра, если вы вызовете «Quit», но не убьете свой COM-объект, у вас будет зависший процесс.

Порядок операций для выхода должен быть изснизу вверх.Выйдите из Outlook, затем убейте объект COM, затем закройте вашу программу.


Все, что говорится:

Автоматизация Outlook, Excel и всех других офисовПакет программ не поддерживается.Если вы не автоматизируете какой-либо устаревший сценарий или не работаете с людьми, которым неудобно (или незнакомо) с написанием программного обеспечения, вам, вероятно, следует использовать тот факт, что Microsoft Office теперь следует стандарту open office suite:

https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office

С C # вы знакомы, и все офисные документы представляют собой файлы XML.Если вы отправляете или получаете электронную почту, вы, вероятно, можете использовать SMTP-клиенты, встроенные в C #, или реализовать что-то, что будет сделано так, как вам нужно.Если вы создаете что-то новое, я настоятельно рекомендую держаться подальше от Office Automation.

0 голосов
/ 06 мая 2019

Outlook закрывается, когда закрывается его последнее окно.Ваш код явно отображает папку «Входящие» в проводнике.Outlook будет оставаться открытым до тех пор, пока это окно не будет закрыто.

...