Как предварительно заполнить Outlook MailItem и избежать исключений com из охраны объектной модели - PullRequest
1 голос
/ 11 мая 2010

Я работаю в компании, которая разрабатывает инструмент CRM и предлагает интеграцию с MS Office (2003 и 2007) из Windows XP в 7. (Я работаю с использованием Win7)

Моя задача - вызвать экземпляр Outlook (используя C #) из этого инструмента CRM, когда пользователь хочет отправить электронное письмо и предварительно заполнить данными инструмента CRM (электронная почта, получатель и т. Д.)

Все это уже отлично работает.

Проблема, с которой я столкнулся, заключается в том, что «объектная модель» в Outlook выдает исключение com

(Операция прервана (Исключение из HRESULT: 0x80004004 (E_ABORT))))

момент, когда я пытаюсь прочитать защищенное значение из mailItem (например, mail.bodyHTML).

Пример фрагмента:

using MSOutlook = Microsoft.Office.Interop.Outlook;

//untrusted Instance
 _outlook = new MSOutlook.Application();

 MSOutlook.MailItem mail = (MSOutlook.MailItem)_outlook.CreateItem(MSOutlook.OlItemType.olMailItem);

 //this where the Exception occurs
 string outlookStdHTMLBody = mail.HTMLBody;

Я немного прочитал и знаю, что мой экземпляр Outlook (полученный с помощью нового приложения) считается ненадежным, и, следовательно, включается «omg».

У меня есть обходной путь для разработки:

Я использую VS2010 от имени администратора, и если я запускаю Outlook от имени администратора также - все хорошо. Я полагаю, это связано с тем, что они имеют одинаковые уровни целостности (высокий), а UAC (?) Не жалуется. Но это не тот путь к развертыванию.

Теперь вопрос:

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

Я уже читал, что при разработке надстройки Office с использованием VSTO можно получить доверенный экземпляр из события OnComplete и / или с помощью «ThisAddin»

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

И чтобы было понятно - у меня нет проблем с всплывающими окнами, информирующими пользователя о доступе к outlook - я просто хочу избавиться от исключения!

Так, как я могу обойти эту проблему, используя код?

Любая помощь высоко ценится!

Thomas

Ответы [ 2 ]

2 голосов
/ 11 мая 2010

Взгляните на Dimitry's Redemption Lib , он был разработан, чтобы сделать это точно.

0 голосов
/ 12 мая 2010

Ну

Я уже потратил слишком много времени и энергии на этот вопрос, поэтому я думаю, что нашел прагматичный обходной путь для моего конкретного случая - но никакого реального решения!

Проблема, по-видимому, связана с тем, что программы работают на разных уровнях целостности (Outlook = средний, VS2010 = администратор или высокий). Office по умолчанию работает на среднем уровне, и поэтому мое будущее приложение будет развернуто. Так что не должно быть никаких проблем, поскольку, если CRM и Outlook работают на одном уровне, проблем нет.

Для разработки я просто позволил им работать как на высокой, так и на средней (запуск моих скомпилированных файлов из папки отладки).

В любом другом случае отображается предупреждение в окне сообщения, информирующее пользователя о различных уровнях целостности, которые вызывают исключение и препятствуют доступу.

На уровне кода, когда я пытаюсь прочитать какие-либо (с помощью Outlook) предварительно подготовленные, защищенные свойства и объектная модель защиты вызывает исключение, я просто ловлю его и вместо этого использую значения по умолчанию.

Почему я должен был читать их в первую очередь, в настоящее время мне неведомо, но так же были и спецификации, которые были переданы мне.

В любом случае, спасибо за чтение, и если я когда-нибудь придумаю решение, я обязательно опробую его - до тех пор имейте в виду, что прагматическое решение лучше, чем ничего!

С Днем отца всех!

...