【问题标题】:Outlook VSTO add-in 80080005 exception while looking up tasks查找任务时 Outlook VSTO 加载项 80080005 异常
【发布时间】:2017-10-19 17:55:59
【问题描述】:

我有一个 VSTO 加载项,它通过 EntryID 或 Subject 查找 Outlook 任务,并对其执行一些操作。

其中一位用户从中记录了以下错误消息:

由于以下错误,检索具有 CLSID {0006F03A-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败:80080005 服务器执行失败(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE))

这是查找任务项的函数

public Outlook.TaskItem FindTask(String EntryID, String Subject)
{
    try
    {
        Outlook.Application OutlookApp = new Outlook.Application();
        Outlook.NameSpace ns = null;
        Outlook.MAPIFolder tasksFolder = null;
        Outlook.Items taskFolderItems = null;
        Outlook.Items filteredtaskFolderItems = null;
        Outlook.TaskItem task = null;


        ns = OutlookApp.Session;
        ns.SendAndReceive(false);
        tasksFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
        taskFolderItems = tasksFolder.Items;

        //Try to find the task by entryID
        dynamic OutlookItem = null;
        OutlookItem = ns.GetItemFromID(EntryID);
        if (OutlookItem != null)
        {
            if (OutlookItem is Outlook.TaskItem)
            {
                Outlook.TaskItem foundItem = (Outlook.TaskItem)OutlookItem;
                return foundItem;
            }
        }

        //If not found by EntryID, find it by a Subject
        string subjectmatch = "[Subject] ='" + Subject + "'";
        filteredtaskFolderItems = taskFolderItems.Restrict(subjectmatch);

        for (int i = 1; i <= filteredtaskFolderItems.Count; i++)
        {
            task = (Microsoft.Office.Interop.Outlook.TaskItem)filteredtaskFolderItems[i];
            return task;
        }
    }
    catch(Exception ex)
    {
        //log exception
    }
    return null;
}

我找到了一些关于错误日志的解释,但没有一个真正有意义(多个用户访问同一个 COM 接口、注册表混乱等)

有任何明显迹象表明代码可能是错误的,这就是生成此异常的原因,还是 Outlooks 错误?

我必须提到,我正在从另一个 Office 应用程序实例化 Outlook。

【问题讨论】:

    标签: outlook vsto outlook-addin office-addins


    【解决方案1】:

    这很可能意味着您的应用在与 Outlook 不同的安全环境中运行。
    任一应用程序是否以提升的权限运行(以管理员身份运行)?

    另外,如果此代码在插件中,为什么要创建 Outlook.Application 的新实例而不是使用传递给插件的实例?

    【讨论】:

    • 你好德米特里!感谢您的回复,并积极处理这些 Outlook 问题!我上面提到的代码在 Excel 加载项中运行,我在其中创建了一个 Outlook 实例,并从那里开始工作。该加载项在 Excel 和 Outlook 之间建立了连接,这就是我实例化一个新 Outlook 对象的原因。关于安全上下文,我不知道有关它的任何信息,我按照 MSDN 教程和文章以及 SDK 来创建它。我无法重现该问题,但我的一些客户可以。看起来 Outlook 会随时超时,并导致异常。还有其他想法吗?
    • 另外,如果您也可以查看这个问题,我将非常高兴:stackoverflow.com/questions/43782786/… 这是 Outlook 的另一个谜团,我无法解决。
    • 那么要么运行启动为“以管理员身份运行”吗?如果 Outlook 在您的代码实例化 Outklook.Applicaiton 对象的实例之前运行,它是否有效?
    • 我不知道加载项必须在管理员权限下运行的要求。通常我会按原样启动办公应用程序,而无需右键单击并以管理员身份运行。如果 Outlook 没有运行,它就可以工作,如果它运行,它甚至可以工作。我知道这里还有改进的余地,所以如果它已经在运行,我应该只获取正在运行的实例而不是创建一个新实例,但是为了简化代码示例,我将其省略了。而且它似乎对报告的问题没有影响。最糟糕的是,我无法重现相同的内容......
    • 没有这个要求。但是如果安全上下文不匹配,你就会遇到问题。
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 2017-11-04
    • 2014-05-10
    • 2014-06-01
    • 2021-11-27
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多