2013-09-06 6 views
5

उदाहरण खोलते समय pywin32 के साथ एक स्प्रेडशीट, मैं दो विकल्प ऐसा करने के लिए मिला:pywin32 का उपयोग करके, डिस्पैच और डिस्पैचएक्स के बीच क्या अंतर है?

excel1 = win32com.client.DispatchEx('Excel.Application') 
wb = excel1.Workbooks.Open('myxls.xls') 

या मैं

excel2 = win32com.client.Dispatch('Excel.Application') 
wb = excel2.Workbooks.Open('myxls.xls') 

कर सकता है और मैं सोच रहा हूँ अगर यह किसी भी फर्क नहीं पड़ता। docstrings मेरी मदद नहीं करते ज्यादा या तो:

>>> w32.Dispatch.__doc__ 
'Creates a Dispatch based COM object.\n ' 

>>> w32.DispatchEx.__doc__ 
'Creates a Dispatch based COM object on a specific machine.\n ' 

this में साइट वे बताते हैं कि DispatchEx दूरदराज के उपयोग के लिए हो सकता है।

क्या इससे कोई फर्क पड़ता है जब मैं अपने पीसी पर स्प्रैडशीट स्वचालित करने की कोशिश कर रहा हूं?

+0

यह देखते हुए कि 'डिस्पैचएक्स' दस्तावेज नहीं किया गया है और 'डिस्पैच' है, ऐसा लगता है कि आपको बाद में इसका उपयोग करना चाहिए जब तक कि आपके पास अन्यथा करने का कोई अच्छा कारण न हो। यदि आप एक व्यावहारिक प्रश्न पूछ रहे हैं, तो यह जवाब है। यदि आप जानना चाहते हैं कि चीजें हुड के नीचे कैसे काम करती हैं, तो हमें शायद स्रोत को देखने की आवश्यकता है। – abarnert

उत्तर

11

यह आप क्या चाहते हैं पर निर्भर करता है। यदि एक्सेल पहले से खुला है, तो प्रेषण का उपयोग खुले एक्सेल इंस्टेंस में एक नया टैब बनाएगा। यदि एक्सेल पहले से खुला है, तो dispatchEx का उपयोग Excel का एक नया उदाहरण खुल जाएगा।

+1

मैं डिस्पैच का उपयोग कर रहा हूं और यह वैसे भी एक नया एक्सेल इंस्टेंस खोलता है। क्यूं कर? मैं पहले से खुले उदाहरण से कनेक्ट करना चाहता हूं। मुझे कैसे करना चाहिए? –

3

DispatchEx दर्ज नहीं किया जाता है, और Dispatch जो पहले से ही व्यावहारिक जवाब निकलता है, है: बस Dispatch उपयोग करते हैं, जब तक आप कुछ बहुत अच्छा आप किसी विशेष परिस्थिति में विश्वास करने का कारण है।

हालांकि, अगर आप कवर के तहत मतभेद पता करना चाहते हैं:

the pywin32 source से, आप देख सकते हैं कि DispatchEx प्रयास करता है लिपटे-अप IDispatchEx इंटरफ़ेस वापस जाने के लिए नहीं बल्कि IDispatch से। (बहुत आश्चर्य की बात नहीं है, नाम दिया।)

आप MSDN पर IDispatchEx देख सकते हैं, और आप देखेंगे कि यह

IDispatch इंटरफ़ेस का एक विस्तार है, जैसे गतिशील भाषाओं के लिए उपयुक्त सुविधाओं का समर्थन करता पटकथा भाषाएं।

विचार यह है कि, अगर बात आप को स्वचालित कर रहे हैं एक गतिशील वस्तु (आप अजगर या जावास्क्रिप्ट में है वस्तु की तरह) की तरह है, बजाय एक स्थिर वस्तु (आप में है वस्तु की तरह की तरह है सी ++ या जावा), विजुअल बेसिक कोड रनटाइम पर सदस्यों को अपनी गतिशील प्रकृति-गणना, जोड़ और हटा सकता है।

और निश्चित रूप से pywin32 लगभग सबकुछ VB कर सकता है, आपको बस थोड़ा और स्पष्ट होना चाहिए कभी कभी। इस मामले में, आपको DispatchEx बनाने की आवश्यकता है, और इसकी DeleteMemberByName आदि विधियों को कॉल करें।

1

यदि आप स्वचालित करने के लिए COM का उपयोग कर रहे हैं, तो कहें, एक्सेल में एक समय आएगा जब आप चाहते हैं। एप्लिकेशन के एक नए उदाहरण को फायर करने के लिए डिस्पैच करें, डेस्कटॉप पर पहले से चल रहे किसी के साथ हस्तक्षेप न करें।

उपयोग DispatchEx बजाय डिस्पैच

+0

'डिस्पैच' के साथ क्या गलत होगा? – pandita

+2

कुछ जो मैंने अभी भाग लिया है वह डिस्पैच के साथ गलत हो सकता है।यदि आप एक जीयूआई (या थ्रेडेड कुछ भी लिख रहे हैं) लिख रहे हैं और थ्रेड में कुछ पृष्ठभूमि काम करना चाहते हैं जिसके लिए कॉम ऑब्जेक्ट इंस्टेंस की आवश्यकता है, तो आपको पहले pythoncom.CoInitialize() को कॉल करना होगा या आपको com_errors का एक गुच्छा मिलेगा। अब, यदि आप डिस्पैच द्वारा बनाई गई ऑब्जेक्ट का उपयोग करके अग्रभूमि में कुछ करने का प्रयास करते हैं, जबकि पृष्ठभूमि कार्य डिस्पैच द्वारा बनाए गए ऑब्जेक्ट का उपयोग कर रहा है (वे उसी एप्लिकेशन का संदर्भ लेंगे), कॉल अस्वीकार कर दिए जाएंगे। डिस्पैचएक्स फिक्स करता है कि प्रति थ्रेड अलग-अलग उदाहरणों का उपयोग करके। –

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