2012-09-05 21 views
7

मेरी कोड Microsoft.Office.Interop.PowerPoint.Application का एक नया उदाहरण बनाने के लिए कोशिश करता है, मैं कभी कभी निम्न अपवाद प्राप्त करें:PowerPoint स्वचालन करते समय मैं RPC_E_CALL_REJECTED अपवादों से कैसे बचूं?

System.Runtime.InteropServices.COMException (0x80010001): Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80010001 Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)). 
    at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType) 
    at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType) 
    at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj) 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 

मैं कभी कभी कहते हैं, क्योंकि यह लगातार ऐसा नहीं होता है यहां तक ​​कि एक ही इनपुट दिया। इसके अलावा, यह मेरे कोड के अन्य हिस्सों में भी स्थिरता की समान कमी के साथ होता है जहां मैं पावरपॉइंट ऑटोमेशन एपीआई के साथ भी बातचीत करता हूं।

मैंने एमएसडीएन से this समाधान का प्रयास किया है जो कि वहां सबसे अधिक अनुशंसित समाधान प्रतीत होता है। हालांकि, ऐसा कोई प्रभाव नहीं प्रतीत होता है क्योंकि मैं अभी भी वही व्यवहार देखता हूं।

मेरे प्रश्न हैं:

  1. PowerPoint स्वचालन के लिए MSDN समाधान काम करता है?
  2. मैं कैसे सत्यापित कर सकता हूं कि मैंने इसे अपने कोड पर सही ढंग से लागू किया है या नहीं?
  3. क्या किसी के पास कोई वैकल्पिक समाधान है?

मैं सी # का उपयोग कर रहा, नेट 4 और PowerPoint 2007.

+0

मैं एक ही समस्या में चल रहा हूं। शायद एक थ्रेड जोड़ना। नींद (100) यहां और वहां मदद करनी चाहिए? चार्ट भरने से ग्राफ़िक्स इत्यादि को अपडेट करने में कुछ समय लगता है, इसलिए आपको अधिक डेटा जोड़ने से पहले इसके लिए इंतजार करना पड़ सकता है। – CodingBarfield

उत्तर

2
  1. मैं इसे करने की कोशिश नहीं की है, लेकिन एंड्रयू ह्वाइटचैपल कार्यालय के लिए एक ही दृष्टिकोण का वर्णन करता है तो मुझे लगता है कि यह काम करना चाहिए: http://blogs.msdn.com/b/andreww/archive/2008/11/19/implementing-imessagefilter-in-an-office-add-in.aspx

  2. कोशिश :)

  3. एक और तरीका त्रुटि और पुन: प्रयास पकड़ने द्वारा तंत्र इंतजार कर किसी प्रकार का लागू करने के लिए किया जाएगा दें (यह भी उल्लेख किया here)।

2

मैंने पहले इस में चलाने की है और Paul B वास्तव में सही है। यह इस बात पर निर्भर करता है कि क्या आप पावरपॉइंट ओएम को मुख्य थ्रेड (यानी This_AddIn) से कॉल कर रहे हैं या नहीं। यदि आप हैं, तो पीपीटी को इन अपवादों को फेंकना नहीं चाहिए। हालांकि, अगर आप किसी अन्य थ्रेड से पीपीटी को कॉल कर रहे हैं, तो आपको इन विंडोज़ संदेश पंप त्रुटियों को कुशलता से संभालने के लिए IMessageFilter को कार्यान्वित करना होगा क्योंकि पीपीटी अन्य धागे से कॉल पर ओएम को मुख्य थ्रेड कॉल को प्राथमिकता देता है, इसलिए कॉल रिजेक्शन।

एक और चेतावनी है जिसके लिए अतिरिक्त COMException एस 0x800AC472 (VBA_E_IGNORE) को संभालने के लिए आगे बॉयलर प्लेट कोड की आवश्यकता है। एक उदाहरण here है।

तो, पूर्ण समाधान दोनों IMessageFilter लागू करने के लिए और जिसमें sepp2k's कोड की तरह कुछ का उपयोग करने के क्रम COMException के अन्य प्रकार है कि फेंक दिया जा सकता है संभाल करने में अपनी ओम कॉल रैप करने के लिए है।

तो, उसकी तरह रैपिंग कोड के लिए:

private void TryUntilSuccess(Action action) 
{ 
    bool success = false; 
    while (!success) 
    { 
     try 
     { 
      action(); 
      success = true; 
     } 

     catch (System.Runtime.InteropServices.COMException e) 
     { 
      if ((e.ErrorCode & 0xFFFF) == 0xC472) 
      { // Excel is busy 
       Thread.Sleep(500); // Wait, and... 
       success = false; // ...try again 
      } 
      else 
      { // Re-throw! 
       throw e; 
      } 
     } 
    } 
} 

जो आप इस तरह lamdas साथ कह सकते हैं:

TryUntilSuccess(() => 
{ 
    RegisterFilter(); // register this thread for IMessageFilter use 
    ppt_app.DoSomething();   
    UnRegisterFilter(); // unregister this thread for IMessageFilter use 
};) 

इस दो आयामी दृष्टिकोण के लिए कारण है IMessageFilter रणनीति अधिक है कि अपवाद फेंकने से कुशल और ऐप से आने वाले व्यस्त संदेशों को संभालने में सक्षम नहीं होने की तुलना में अधिक बार होगा। हालांकि, अन्य समय में आप अपवाद को संभालने के लिए ताकि आप दोनों क्या करना है जो रैपर

HTH शामिल होगा ...

IMessageFilter implementation के लिए यहां देखें!

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