如何预填充Outlook MailItem并避免来自对象模型防护的com异常

时间:2010-05-11 14:13:26

标签: c# windows-7 outlook integration

我在一家开发CRM工具的公司工作,并提供从Windows XP到7的MS Office(2003& 2007)的集成。(我正在使用Win7工作)

我的任务是当用户想要发送电子邮件并预填充CRM工具的数据(电子邮件,收件人等等)时,从此CRM工具调用Outlook实例(使用C#)。

所有这些都已经很好了。

我遇到的问题是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的可信实例,以便我可以避免此异常?

我已经读过,使用VSTO开发Office加载项时,可以从OnComplete事件和/或使用“ThisAddin”获取受信任的实例

但我“只是”想要启动一个outlook实例并预先填充它,并且不想开发一个Add-In,因为这不是必需的。

为了说清楚 - 我没有问题弹出窗口通知用户正在访问Outlook - 我只是想摆脱异常!

那么如何使用代码解决这个问题?

非常感谢任何帮助!

托马斯

2 个答案:

答案 0 :(得分:2)

看看德米特里的Redemption Lib,它的目的就是为了做到这一点。

答案 1 :(得分:0)

那么,

我已经在这个问题上花费了太多的时间和精力,所以我想我为我的具体案例提出了一个实用的解决方法 - 但没有真正的解决方案!

问题显然是由于程序运行在不同的完整性级别(Outlook = medium,VS2010 = admin或high)。默认情况下,Office在中等级别运行,因此我的未来应用程序一旦部署就会​​运行。所以不应该有任何麻烦,因为如果CRM和Outlook运行在同一水平,那就没问题了。

对于开发,我只是让它们都运行在高或中(从调试文件夹启动我编译的文件)。

在任何其他情况下,都会显示一个消息框警告,通知用户导致异常并阻止访问的不同完整性级别。

在代码级别,当我尝试读取任何(通过Outlook)预先解压缩,受保护的属性和对象模型保护引发异常时,我只是捕获它并使用默认值。

为什么我必须首先阅读它们目前已超出我的范围 - 但是交给我的规格也是如此。

无论如何,感谢阅读,如果我想出一个解决方案,我一定会用它来解决它 - 直到那时记住一个实用的解决方案比没有好!

大家父亲节快乐!