2017-08-17 35 views
5

Chúng tôi đã phát triển một bổ trợ VSTO C# Office, giao tiếp với một cá thể Outlook đang chạy (hoặc bắt đầu một phiên bản mới), và nó có dấu hiệu có vấn đề cho phép trên một số máy tính khách hàng trong khi cố gắng để tạo ra nhiệm vụ Outlook hoặc các cuộc hẹn ...Văn phòng VSTO bổ sung các vấn đề có thể cho phép - HRESULT 0x80004004 (E_ABORT)

thông điệp ngoại lệ như sau:

Operation hủy bỏ (ngoại lệ từ HRESULT: 0x80004004 (E_ABORT))

Th là xảy ra ở đây:

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 = "[email protected]"; 

Sau khi tiếp xúc với người sử dụng, họ nói với chúng tôi, rằng họ đang chạy dưới một tập phép thực sự hạn chế và mạng.

điều Weird là, đoạn mã này thực sự chạy trơn tru cho họ, trong đó chứng minh, rằng kết nối đang làm việc giữa Outlook và Office khác add-in:

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

Các bộ phận CNTT đã cố gắng để điều chỉnh chính sách bảo mật của Outlook trên PC bị ảnh hưởng. Chúng được phép truy cập có lập trình.

Chúng không thể khởi động các công cụ có đặc quyền của quản trị viên nhưng không cần thiết. Thực tế là 3 dòng mã cuối cùng hoạt động (có loại tài khoản) chứng minh rằng ứng dụng thực sự khởi động đúng, nhưng có vẻ như nó chỉ có thể chạy một số tính năng ...

Tôi cũng muốn lưu ý, rằng họ đang sử dụng Exchange, nhưng dường như họ không có vấn đề đồng bộ hóa (nếu những điều này có thể ảnh hưởng đến bất kỳ điều gì, ...)

EDIT: Đây là việc triển khai GetAccountForFolder, đối tượng Outlook.Account mặc định. Đây là một đoạn mã mà tôi đã tìm thấy nằm xung quanh, và thấy nó hoạt động rất tốt.

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; 
} 
+0

Việc triển khai GetAccountForFolder của bạn là gì? Do yo sử dụng cùng một vấn đề trong OutlookSpy? (bấm vào Không gian tên nút, chọn Tài khoản, bấm Duyệt, đi đến các IEnumVariant tab, bấm đúp vào tài khoản trong câu hỏi). –

+0

Xin chào Dmitry! Cảm ơn bạn đã làm việc tích cực của bạn xung quanh bất cứ điều gì Outlook liên quan, tôi đã tìm thấy rất nhiều ý kiến ​​/ câu trả lời của bạn là hữu ích! Bạn có nghĩa là tôi nên yêu cầu người dùng cài đặt OutlookSpy và sử dụng nó cho cuộc điều tra này không? – Laureant

Trả lời

1

Vấn đề là bạn có race condition in a COM Add-In object. Bạn nên thực hiện một sự chậm trễ nhân tạo trong phương pháp của bạn. Chỉ cần thực hiện các lần thử lại cho đến khi bạn thành công, như sau:

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); 
    } 
} 
+0

Tôi hiểu. Vì vậy, tôi nhận được lỗi 0x80004004 vì một trong các đối tượng không thể truy cập được YET bởi bổ trợ của tôi. Tôi nghĩ điều quan trọng ở đây là chúng tôi đang liên lạc với Outlook, từ bên ngoài Outlook. – Laureant

0

Bạn có thể cần phải chờ một chút sau khi tìm nạp Tài khoản.

Outlook.Account DefaultAccount = null; 
Outlook.Application outlookApp = GetOutlookApp(); 
DefaultAccount = GetAccountForFolder(outlookApp); 
Thread.Sleep(5000); // a bit of startup grace time. 

Các lỗi Aborted 0x80004004 thường xuất hiện trong Interop.Outlook do này, xem Can only send email via Outlook if Outlook is open

Các vấn đề liên quan