Подключение к существующему процессу Outlook - PullRequest
2 голосов
/ 26 июня 2010

Я создаю приложение, которое открывает существующие почтовые сообщения в Outlook.Пользователь может или не может уже работать Outlook.Все работает хорошо, если Outlook не работает, но если он уже запущен, я получаю сообщение об ошибке COM (80080005).Похоже, что в Интернете это может произойти, если существующий процесс Outlook работает с более высоким уровнем разрешений, чем приложение, которое пытается с ним связаться.

Есть ли какой-то другой способ попросить Outlook открытьсообщение, или мне просто нужно убедиться, что я сопоставляю уровни разрешений?

Спасибо,

-Патрик

РЕДАКТИРОВАТЬ Добавление кода в исходный вопрос,поскольку переполнение стека не допускает значимого форматирования в комментариях.

Первоначально я делал следующее:

var outlook = new Outlook.Application();

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

Я изменил это, чтобы сделать его более понятным для COM:

Application outlook;
try
{
    outlook = (Application)Marshal.GetActiveObject("Outlook.Application");
}
catch (COMException ex)
{
    if (ex.ErrorCode == -2147221021)
        outlook = new ApplicationClass();
    else
        throw;
}

Однако этот код все еще не совсем работает- если Outlook работает, я перехватываю исключение, код ошибки которого 0x800401E3 (MK_E_UNAVAILABLE).Но когда я пытаюсь создать новый объект ApplicationClass, я все равно получаю тот же код ошибки 80080005.

Я также попытался поместить следующее в блок catch вместо строки new ApplicationClass(), но нет никакой разницыв поведении:

outlook = (Application) Activator.CreateInstance(
    Type.GetTypeFromProgID("Outlook.Application"));

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Оказывается, причиной проблемы был отладчик - я запускал Word из отладчика Visual Studio.При запуске Word по обычным путям код 80080005 исчезает.

-Patrick

0 голосов
/ 26 июня 2010

Не видя ваш код, я догадываюсь, но похоже, что вы звоните CreateObject().Вам нужно позвонить GetObject(), если Outlook уже запущен.

Сначала используйте GetObject, чтобы узнать, запущен ли уже Outlook (Вам нужно отловить ошибку).

...