c# - Office VSTO 加载项可能的权限问题 - HRESULT 0x80004004 (E_ABORT)

标签 c# outlook vsto outlook-addin office-addins

我们开发了一个 C# Office VSTO 加载项,它与正在运行的 Outlook 实例通信(或启动一个新实例),并且在尝试创建 Outlook 任务或约会...

异常信息如下:

Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT))

这发生在这里:

Outlook.Account DefaultAccount = null;
Outlook.Application outlookApp = GetOutlookApp();    //returns Application object of running Outlook instance / creates a new instance - it works for them.

DefaultAccount = GetAccountForFolder(outlookApp);    //returns the default account of the user. Tried it with a simple setup, only one account etc. - it works for them
String defaultemailaddress;

//CODE RUNS UNTIL THIS POINT
if (DefaultAccount == null)    //if somehow this would end up NULL, which is not the case, because: see code snippet below!
{
    defaultemailaddress = outlookApp.Session.CurrentUser.AddressEntry.Address;
}
else
{
    defaultemailaddress = DefaultAccount.SmtpAddress;    //this could be the problem, but I can't debug it further, and it works in the code block below, to get the AccountType, so I don't understand why I couldn't get the SmtpAddress without a hard exception
}
//FAILS BEFORE THIS LINE COULD RUN.
String email = "test@emailserver.com";

在与用户联系后,他们告诉我们,他们在非常有限的权限集和网络下运行。

奇怪的是,这段代码实际上对他们来说运行得很顺利,这证明 Outlook 和其他 Office 加载项之间的连接正常:

Outlook.Application oApp = GetOutlookApp();
Outlook.Account DefaultAccount = GetAccountForFolder(oApp);
String AccountType = DefaultAccount.AccountType.ToString();

IT 部门已经尝试调整受影响 PC 上 Outlook 的安全策略。他们允许编程访问。

他们无法以管理员权限启动工具,但这不是必需的。最后 3 行代码有效(获取帐户类型)的事实证明应用程序确实在正确启动,但看起来它只能运行某些功能...

我还想指出,他们正在使用 Exchange,但显然他们没有同步问题(如果这些可能会影响任何事情,那么...)

编辑: 下面是 GetAccountForFolder 的实现,它获取默认的 Outlook.Account 对象。这是我发现的一段代码片段,发现它运行良好。

public static Outlook.Account GetAccountForFolder(Outlook.Application outlookApp)
{
    // Obtain the store on which the folder resides.
    Outlook.Store store = outlookApp.Session.DefaultStore;

    // Enumerate the accounts defined for the session.
    foreach (Outlook.Account account in outlookApp.Session.Accounts)
    {
        // Match the DefaultStore.StoreID of the account
        // with the Store.StoreID for the currect folder.
        if (account.DeliveryStore.StoreID == store.StoreID)
        {
            // Return the account whose default delivery store
            // matches the store of the given folder.
            return account;
        }
    }
    // No account matches, so return null.
    return null;
}

最佳答案

问题是你有 race condition in a COM Add-In object .您应该人为地延迟您的方法。简单地重试直到成功,就像这样:

bool isDone = false;
while (!isDone)
{
    try
    {
        // your action with Add-In here...

        isDone = true;
    }
    catch (System.Runtime.InteropServices.COMException exception)
    {
        // small delay
        Thread.Sleep(10);
    }
}

关于c# - Office VSTO 加载项可能的权限问题 - HRESULT 0x80004004 (E_ABORT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45733442/

相关文章:

c# - VS 2010错误 "Value to add was out of range. Parameter name: value "

HTML 代码在 Outlook 2010 上无法正确呈现

用于在 Outlook 邮件中搜索的 Excel VBA

excel - F# ExcelUsedRange 没有属性或方法

c# - 通过 C# 将字符串、数字数据写入 Excel 是可行的,但 Excel 无法正确处理数字数据

c# - 是否可以指定代码契约以确保该方法不会更改对象的状态

c# - 将 "TOP 1"添加到 sql 语句是否会显着提高性能?

c# - 如何使用 LINQ 从子文件夹中递归读取文件名

excel - 从剪贴板复制到VB中的数组

msbuild无法编译vsto项目