2010-03-21 12 views
5

मैं अपेक्षाकृत नया WiX के लिए नया हूं। यह एक अच्छा टूल है, लेकिन मुझे इसे बेहतर तरीके से सीखने के लिए अभी भी की आवश्यकता है। मुझे COM घटक के पंजीकरण और पंजीकरण के साथ कोई समस्या आई है। मैंने दो अनुप्रयोगों के लिए इंस्टॉलर बनाए हैं, उन्हें ए और बी दोनों कॉल करने के लिए एक ही COM घटक का उपयोग कर रहे हैं। मैंने गर्मी उपकरण का उपयोग किया है, अनुशंसित है। ए या बी स्थापित करते समय, घटक समस्याओं के बिना पंजीकृत है।WIX: दो प्रोग्रामों में से एक को हटाने पर COM अनियंत्रण

लेकिन जब मैं ए और बी स्थापित करता हूं, तो ए को हटाएं (जोड़ें/निकालें प्रोग्राम) COM कक्षा अनियंत्रित हो जाती है और बी अब इसका उपयोग नहीं कर सकता है। क्या ऐसा होने से रोकने के लिए कोई साफ समाधान है? जब मैं ए और बी को अनइंस्टॉल कर दूं तो मैं COM को अनधिकृत करना चाहता हूं।

किसी भी मदद की सराहना की जाएगी,

सादर, madbadger

संपादित करें: अपनी प्रतिक्रियाओं के लिए धन्यवाद। मैंने दोनों इंस्टॉलरों में GUID को एक ही मान पर सेट किया है और अब रजिस्ट्री कुंजियों को ठीक से हटाया जा रहा है, यही वह समय है जब सिस्टम से अंतिम प्रोग्राम हटा दिया जाता है।
होवर, समस्या एक कारण के लिए बनी हुई है। मैंने HKEY_CLASSES_ROOT/CLSID/[उपयुक्त COM GUID] के अंतर्गत रजिस्ट्री की जांच की है। ऐसा होता है:
- मैं ए स्थापित करता हूं और COM का पथ [A/घटक.dll के पथ] पर सेट होता है
- मैं बी स्थापित करता हूं और COM का पथ सेट किया जाता है [बी/घटक.dll के पथ ]
- मैं बी को हटाता हूं और COM अवशेषों का पथ [बी/घटक.dll के पथ]
- अब ए पंजीकृत घटक के माध्यम से COM घटक तक नहीं पहुंच सकता है, क्योंकि [बी/घटक.dll का पथ] मौजूद नहीं है अब

अब मुझे लगता है कि COM घटक को दोनों अनुप्रयोगों के लिए एक ही निर्देशिका में रखना अनिवार्य है। क्या विंडोज इंस्टालर पुराने पथ पर वापस जाने में सक्षम नहीं है, या क्या यह कुछ है जो मुझे याद नहीं है?

उत्तर

4

Windows इंस्टालर आप के लिए यह करना होगा, लेकिन केवल तभी अपने COM घटक दोनों एक में एक ही GUID और बी, है (और dll के दोनों अनुप्रयोगों के द्वारा एक ही स्थान पर स्थापित कर रहे हैं।)

विंडोज इंस्टालर प्रत्येक घटक (पूरे सिस्टम में) संदर्भ-गणना करके काम करता है। घटक उनकी GUID द्वारा पहचाने जाते हैं।

  • एक स्थापित करें::

    तो COM घटक समान GUID है, क्या होता है यह है घटक refcount से चला जाता है: घटक refcount 0-> 1 से, Windows इंस्टालर यह पंजीकृत करता

  • बी स्थापित हो जाता है 1-> 2, कुछ नहीं होता
  • स्थापना रद्द करें एक: घटक refcount चला जाता है 2-> 1 से, कुछ नहीं होता
  • स्थापना रद्द बी: घटक refcount 1-> 0 से, Windows इंस्टालर यह unregisters चला जाता है

यह एक ही GUID नहीं है, तो क्या होता है, इस

  • स्थापित एक है: घटक एक refcount चला जाता है 0-> 1 से, Windows इंस्टालर यह पंजीकृत करता
  • बी स्थापित करें: घटक बी refcount चला जाता है 0-> 1 से, विंडोज इंस्टालर इसे पंजीकृत करता है, घटक ए
  • अनइंस्टॉल ए से घटक लिखना: घटक एक refcount 1-> 0 से चला जाता है, विंडोज इंस्टालर रजिस्ट्री प्रविष्टियों को हटाकर इसे अनियंत्रित करता है।
    - ऐसा लगता है कि इस स्थिति आप
  • स्थापना रद्द बी में हैं: घटक बी refcount 1-> 0 से, Windows इंस्टालर यह unregisters, रजिस्ट्री प्रविष्टियाँ को हटाने चला जाता है (लेकिन वे पहले से ही हटा रहे हैं)
  • टिप्पणियों से

संपादित uplifted:

साथ ही GUID, प्रत्येक घटक भी एक "कुंजी पथ" है। यदि घटक में एक या अधिक फ़ाइलें हैं, तो आपको KeyPath="foo.dll" का उपयोग करके "कुंजी" फ़ाइल कौन सी फ़ाइल सेट करनी चाहिए। यदि घटक में एक या अधिक रजिस्ट्री प्रविष्टियां हैं, तो यह समान है।

कुछ स्थापित होने पर जांच करते समय, विंडोज इंस्टालर GUID की जांच करेगा, कुंजी पथ को पढ़ेगा, फिर कुंजी पथ पर फ़ाइल को जांचें (इस प्रकार यह पता चलता है कि कौन सी संस्करण चीजें हैं, अन्य चीजों के साथ), इसलिए यदि 2 घटकों में एक ही GUID है, तो में भी वही कुंजी पथ होना चाहिए, जो उत्पाद स्थापित होने पर फ़ाइल सिस्टम में उसी स्थान पर हल होना चाहिए।

यह कहने का एक लंबा तरीका है कि दोनों इंस्टॉलर्स को साझा फ़ाइलों को एक ही स्थान पर रखना होगा। उन्हें कहां रखा जाए, सिस्टम 32 एक अच्छी जगह नहीं है।

मैं सामान्य फाइल फ़ोल्डर (आमतौर पर Program Files\Common Files\YourCompanyName) के तहत कहीं सुझाव देना चाहता हूं। आप इसे विक्स में दर्ज करेंगे: Directory="[CommonFilesFolder]\YourCompanyName"

+0

क्या मुझे दोनों इंस्टॉलरों के लिए COM घटक को एक स्थान पर रखना चाहिए? क्या system32 फ़ोल्डर इसके लिए एक अच्छी जगह है? – madbadger

+0

हाँ, आपको इसे एक ही स्थान पर रखना होगा।(विंडोज इंस्टालर GUID और फ़ाइल/रजिस्ट्री पथ दोनों के साथ पहचान करता है)। System32 एक अच्छी जगह नहीं है। मैं सामान्य फ़ाइलों फ़ोल्डर (आमतौर पर 'प्रोग्राम फ़ाइलें \ सामान्य फ़ाइलें \ YourCompanyName') के तहत कहीं भी सुझाव दूंगा। आप इसे विक्स में इस तरह दर्ज करेंगे: 'निर्देशिका = "[कॉमनफाइलफोल्डर] \ YourCompanyName" ' –

+0

धन्यवाद यह बहुत अच्छी तरह से समझाने के लिए बहुत कुछ! – madbadger

1

अपने घटक टैग में, क्या आप प्रत्येक इंस्टॉलर में एक ही ग्रिड का उपयोग कर रहे हैं?

0

आपको इस सामान्य घटक को मर्ज मॉड्यूल में लपेटना चाहिए और इसे अपने दोनों ऐप्स से संदर्भित करना चाहिए।

यह स्वचालित रूप से साझा डीएलएस को अनइंस्टॉल करने पर अपना काम करने की अनुमति देगा।