2017-08-17 9 views
5

हमने एक सी # कार्यालय वीएसटीओ एड-इन विकसित किया है, जो एक चल रहे आउटलुक इंस्टेंस (या एक नया शुरू होता है) के साथ संचार करता है, और यह संकेत दिखा रहा है कुछ ग्राहकों को पीसी पर अनुमति मुद्दों कर Outlook के कार्य या नियुक्तियों बनाने का प्रयास कर ...कार्यालय वीएसटीओ ऐड-इन संभावित अनुमति मुद्दों - HRESULT 0x80004004 (E_ABORT)

अपवाद संदेश निम्नलिखित है:

ऑपरेशन निरस्त किया गया (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 = "[email protected]"; 

उपयोगकर्ता के साथ संपर्क में मिलने के बाद, उन्होंने हमें बताया है कि वे एक बहुत ही सीमित अनुमति सेट और नेटवर्क के अंतर्गत चल रहे हैं।

अजीब बात यह है कि इस कोड स्निपेट को वास्तव में जो साबित करता है, उनके लिए सुचारू रूप से चलता है, कि कनेक्शन Outlook और अन्य कार्यालय ऐड-इन के बीच काम कर रहा है:

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

आईटी विभाग पहले से ही समायोजित करने की कोशिश की प्रभावित पीसी पर आउटलुक की सुरक्षा नीतियां। उन्होंने प्रोग्रामेटिक एक्सेस की अनुमति दी।

वे व्यवस्थापक विशेषाधिकारों के साथ उपकरण प्रारंभ नहीं कर सकते हैं, लेकिन यह आवश्यक नहीं होना चाहिए। तथ्य कोड काम के उन पिछले 3 लाइनों (जो खाता प्रकार हो जाता है) साबित होता है कि उस आवेदन वास्तव में सही ढंग से शुरू हो रहा है, लेकिन ऐसा लगता है कि यह केवल कुछ सुविधाओं को चला सकते हैं ...

मैं यह भी ध्यान दें करना चाहते हैं, कि वे एक्सचेंज का उपयोग कर रहे हैं, लेकिन स्पष्ट रूप से उनके पास सिंक समस्याएं नहीं हैं (यदि ये कुछ भी प्रभावित कर सकती हैं ...)

संपादित करें: यहां GetAccountForFolder का कार्यान्वयन है, जो डिफ़ॉल्ट Outlook प्राप्त करता है। खाता ऑब्जेक्ट। यह एक कोड स्निपेट है जिसे मैंने चारों ओर बिछाया है, और पाया कि यह बहुत अच्छा काम कर रहा था।

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

GetAccountForFolder का आपका कार्यान्वयन क्या है? क्या आप OutlookSpy में एक ही समस्या का उपयोग करते हैं? (नामस्थान बटन पर क्लिक करें, खाते का चयन करें, ब्राउज़ करें क्लिक करें, IEnumVariant टैब पर जाएं, प्रश्न में खाते पर डबल क्लिक करें)। –

+0

हाय दिमित्री! आउटलुक से संबंधित किसी भी चीज़ के आसपास आपके सक्रिय काम के लिए धन्यवाद, मुझे आपकी बहुत सारी टिप्पणियां/उत्तर उपयोगी साबित हुए हैं! क्या आपका मतलब है कि मुझे उपयोगकर्ता से OutlookSpy स्थापित करने के लिए कहा जाना चाहिए, और इस जांच के लिए इसका उपयोग करें? – Laureant

उत्तर

1

देख समस्या यह है कि आप 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); 
    } 
} 
+0

मैं देखता हूं। इसलिए मुझे 0x80004004 त्रुटि मिलती है क्योंकि मेरे ऐड-इन द्वारा ऑब्जेक्ट्स में से कोई भी एक्सेस नहीं किया जा सकता है। मुझे लगता है कि यहां महत्वपूर्ण बात यह है कि हम Outlook के बाहर से Outlook के साथ संचार कर रहे हैं। – Laureant

0

आप खाता प्राप्त करने में कठिनाई के बाद कुछ देरी के लिए अनुमति देने के लिए आवश्यकता हो सकती है।

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

गर्भपात 0x80004004 त्रुटि अक्सर Interop.Outlook में दिखाई देता है इस के कारण, Can only send email via Outlook if Outlook is open

संबंधित मुद्दे