2009-03-05 25 views
13

हमारे पास कुछ गतिशील HTML पृष्ठ हैं जिनमें <OBJECT> टैग शामिल है जो ActiveX नियंत्रण को तुरंत चालू करता है। उपयोगकर्ता तब किसी अन्य पृष्ठ पर नेविगेट कर सकता है, जिसमें <OBJECT> टैग होता है जो ActiveX नियंत्रण के एक नए संस्करण को इंगित करता है।क्या IE को ActiveX नियंत्रण को अनलोड करने के लिए मजबूर करने का कोई तरीका है?

आईई दूसरे पृष्ठ पर नया ActiveX डाउनलोड और स्थापित करेगा, जो कि पृष्ठ के लिए है। समस्या यह है कि चूंकि आईई ने पहले पृष्ठ पर ActiveX को लोड किया है, इसलिए अब यह उपयोगकर्ता को रीबूट करने के लिए मजबूर कर देगा क्योंकि यह डाउनलोड किए गए ActiveX को पूरी तरह इंस्टॉल करेगा, क्योंकि इसका उपयोग किसी प्रक्रिया (आईई) द्वारा किया जा रहा है।

एक सामान्य कंटेनर में मैं अपग्रेड करने का प्रयास करने से पहले ActiveX को अनलोड कर दूंगा। क्या ऐसा करने के लिए आईई को मजबूर करने का कोई तरीका है? एक पृष्ठ के माध्यम से जा रहा है जो नियंत्रण का उपयोग नहीं करता है, अगर वह चाल करेगा तो स्वीकार्य होगा।

संपादित करें:

समाधान की आवश्यकता है कि ActiveX ही कुछ करने के लिए बस काम नहीं करेगा क्योंकि समस्या यह है कि ActiveX स्मृति में अब भी है जब IE ActiveX के नए संस्करण को स्थापित करने से शुरू होता है। मैं जो करने की कोशिश कर रहा हूं वह है कि जब IE उस प्रक्रिया को शुरू करता है तो स्मृति में ActiveX नहीं है, तो जाहिर है कि मैं ActiveX नियंत्रण में कुछ भी भरोसा नहीं कर सकता।

+0

ओर, यह वास्तव में एक अच्छा सवाल है। क्या यह आपका * स्वयं * सक्रिय-एक्स नियंत्रण है, यानी आप इसे बदल सकते हैं, या क्या आपके पास केवल बाइनरी रूप में है? – billmcc

+0

हां, मैं इसे बदल सकता हूं। –

उत्तर

-1

बेवकूफ उत्तर, क्षमा करें। मैं अनुमान लगा रहा हूं कि रीडायरेक्ट काम नहीं करता है यदि आपके पास अभी भी यह प्रश्न खुला है। यदि आपने कोशिश नहीं की है, तो बस एक पृष्ठ बनाएं जो आपके अपडेट किए गए ActiveX पृष्ठ पर रीडायरेक्ट करता है और इसके बजाय वहां लिंक करता है।

middleman.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title>blank page</title> 
<meta http-equiv="REFRESH" content="0;url=http://www.newactivexcontrol.com"></HEAD> 
<BODY> 
</BODY> 
</HTML> 
+0

मुझे खेद है, मैं नहीं देखता कि यह प्रश्न के लिए कैसे प्रासंगिक है। –

1

मुझे लगता है कि यह संभव नहीं है।

0

एक चीज जो आप कोशिश कर सकते हैं, आपके इंस्टॉलर को CoFreeUnusedLibraries() पर कॉल कर रहा है और उसके बाद अपने ActiveX नियंत्रण में DllCanUnloadNow() में S_OK के साथ प्रतिक्रिया दें। यह आपको अनलोड हो सकता है, हालांकि मुझे आश्चर्य है कि क्या आईई अभी भी आपके अनलोड किए गए मॉड्यूल में वापस कॉल करने का प्रयास कर सकता है। कोशिश करने के लिए काफी सरल है।

आप केवल एक स्टब डीएलएल लिख सकते हैं जो आपके इंटरफेस को लागू करता है जो आपके पास स्पर्श करता है और फिर आपके वास्तविक DLL से वास्तव में कार्यक्षमता लागू करता है जो वास्तव में कार्यक्षमता लागू करता है। फिर आप अपने इंस्टॉलर को एक संदेश प्रसारित कर सकते हैं जो कहता है "असली डीएलएल अनलोड करें"। फिर जब आप अपना काम करते हैं तो यह एक और संदेश प्रसारित करता है और यह नया लोड करता है। जबकि अपडेट आपके स्टब को ओकुरिंग करता है, "संदेश अपडेट करते समय प्रतीक्षा करें ..." संदेश खींचता है।

+0

लेकिन आपके उबेर-प्रश्न का उत्तर है, नहीं, आईई आपके लिए किसी भी एक्सटेंशन को अनलोड करने के लिए एक रास्ता नहीं दिखाता है। यह अत्यधिक दुखी कर रहा है। –

+0

क्या इंस्टॉलर? आईई कैब फ़ाइल डाउनलोड करता है (ऑब्जेक्ट टैग में CODEBASE संपत्ति द्वारा इंगित) और इसे पंजीकृत करता है। .ocx फ़ाइल में संभावित रूप से कुछ स्वयं पंजीकरण कोड के बाहर कोई इंस्टॉलर कोड शामिल नहीं है, लेकिन जब यह लोड हो जाता है, तो यह बहुत देर हो चुकी है। –

+0

आपको पहले चलाने के लिए कैब फ़ाइल को .exe में निर्दिष्ट करने में सक्षम होना चाहिए, जब तक कि उन्होंने उस पर सुरक्षा को कड़ा कर दिया हो। –

-1

जाहिर है हाँ और नहीं।

ऐसा हो सकता है लेकिन केवल तभी यदि आप सुरक्षा भेद्यता के माध्यम से इसे "हैक" करते हैं। तो किसी भी वैध प्रक्रिया के माध्यम से नहीं, नहीं।

यहाँ एक लेख भेद्यता राज्य का वर्णन है: http://www.juniper.net/security/auto/vulnerabilities/vuln16409.html

और यहाँ टेकनेट पर एक लेख पर चर्चा कैसे DWORD ActiveX प्रक्रिया http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q240797&sd=tech

इस ActiveX के बारे में नियंत्रित करता है MSDN वेबसाइट से एक उद्धरण है मारता है बताया गया है:

"उपयोगकर्ता सीधे APPLET, EMBED, या OBJECT तत्वों द्वारा लोड किए गए Microsoft ActiveX नियंत्रणों से सहभागिता नहीं कर सकते हैं। उपयोगकर्ता अपने उपयोगकर्ता इंटरफ़ेस को सक्रिय करने के बाद ऐसे नियंत्रणों से बातचीत कर सकते हैं रों।" http://msdn.microsoft.com/en-us/library/ms537508.aspx

+0

मुझे खेद है, लेकिन यह सवाल के लिए बिल्कुल प्रासंगिक नहीं है, हालांकि निश्चित रूप से अपने आप में एक दिलचस्प विषय है। –

+0

किलबिट के पास उनके प्रश्न से कोई लेना देना नहीं है। – EricLaw

0

आप DOM एलीमेंट में अपने ActiveX नियंत्रण जीवन? आप ऐसा करते हैं, IE नियंत्रण बता अनलोड करने के लिए होगा मारने के लिए जावास्क्रिप्ट उपयोग करने की कोशिश है, लेकिन आप इस तथ्य अनलोड में यकीन है कि नियंत्रित करेगा बनाने के लिए किया है। फिर, आपको नए ऑब्जेक्ट संदर्भ के साथ पृष्ठ को हिट करने में सक्षम होना चाहिए, जो नई ऑब्जेक्ट लॉन्च करेगा ....

विफल होने पर, आप एक पॉपअप विंडो खोलने का प्रयास कर सकते हैं जो आपको उस पृष्ठ पर निर्देशित करता है जो कभी भी लोड नहीं करता ऑब्जेक्ट, और साथ ही, मुख्य ब्राउज़र के नामित संदर्भ का उपयोग करके, इसे उस पृष्ठ पर रीडायरेक्ट करें जो आपके ऑब्जेक्ट का संदर्भ नहीं देता है, इसे अनलोड करने का मौका देता है, फिर अपने अपडेट किए गए ActiveX को फिर से संदर्भित करता है। इसे आपके नए नियंत्रण को लोड करना चाहिए

यह एक चिपचिपा मुद्दा है चाहे आप किस तरह से जाएं, लेकिन आप जो भी चाहते हैं उसे करने में सक्षम हो सकते हैं।

यदि आपका नियंत्रण ठीक से व्यवहार नहीं करता है, तो यह ठीक से अनलोड नहीं हो सकता है, इसलिए ऐसा कुछ है जिसके लिए आपको देखना है।

लैरी

0

क्या आप वर्कफ़्लो नहीं बदल सकते? पहले अद्यतन के लिए जांचें और पूरी समस्या से बचें!

जो भी समाधान आप कार्यान्वित करते हैं, ब्राउज़र क्लाइंट द्वारा नियंत्रित होता है और किसी भी (सुरक्षा) अपडेट या नए संस्करण आपके सिस्टम को तोड़ सकते हैं। अपने दूसरे पेज खोलने से पहले

function unloadObject(objId) { 

    var obj = document.getElementById(objId); 

    obj.parentNode.removeChild(obj); 

    delete obj; 
} 

कॉल unloadObject(targetActiveXTagId):

+0

यह वास्तव में एक विकल्प नहीं है। समस्या यह है कि कुछ ग्राहक ActiveX (सख्त आईटी नीतियों के कारण) के पुराने संस्करण का उपयोग करते हैं और उनकी कुछ गलत कॉन्फ़िगर किए गए मशीनों पर IE स्थापित करने के लिए पर्याप्त अनुमति नहीं होने के बावजूद नया ActiveX डाउनलोड करने का प्रयास करता है, इसलिए अनुप्रयोग ... –

+0

उन उपयोगकर्ताओं को ActiveX का एक अलग संस्करण देता है, लेकिन ActiveX लॉगिन पृष्ठ पर भी मौजूद है, लेकिन यह पुराना संस्करण है। एक कामकाज है, लेकिन यह आदर्श नहीं है। मुझे अभी भी मेरे प्रश्न के उत्तर में दिलचस्पी है। –

7

जावास्क्रिप्ट हटाने बयान का प्रयास करें।

आदर्श रूप से, आपको अपग्रेड तंत्र को अपने ActiveX में ही बनाना चाहिए। मैंने कई ऑनलाइन गेम प्लेटफार्मों को अच्छे नतीजों के साथ देखा है।

2

जबकि मुझे डीएलएल को अनलोड करने के लिए आईई प्राप्त करने का कोई तरीका नहीं पता है (यह डीएलएल फ़ाइल संभाल को खुले रखता है - मुझे आशा है कि यह ऑब्जेक्ट्स को सही तरीके से रिलीज़ करे ...) एक समाधान जिसका उपयोग मैं डीएलएल की प्रतिलिपि बनाना चाहता हूं इसे खोलने से पहले एक अस्थायी फ़ाइल (असेंबली संस्करण के आधार पर) पर और फिर स्पष्ट रूप से IE/COM/जो भी कैशिंग को तोड़ना। इस प्रकार, मैं एक "नया" संस्करण लोड कर सकता हूं भले ही पुराना डीएलएल फाइलहेडल खुला रखा गया हो।

मैं केवल कैशिंग को तोड़ने के लिए सक्षम किया गया है जब इन सब मिले हैं:

  1. अलग ProgID (गतिशील रूप से उत्पन्न, DLL से अलग हो सकता है)
  2. अलग CLSID (भी गतिशील रूप से उत्पन्न - एक आकर्षण की तरह काम करता है)
  3. विभिन्न डीएलएल नाम (मूल फ़ाइल की एक प्रति बनाकर और असेंबली संस्करण का उपयोग करके यह डीएलएल-इन-यूज-एक्सेस-एक्सेस त्रुटियों से बचाता है)
  4. विभिन्न असेंबली संस्करण (यह .NET के लिए है)

मैं एक साइडबार गैजेट के लिए विकसित कर रहा हूँ तो मैं बस कुछ विशेषाधिकार प्राप्त ActiveX स्क्रिप्ट के अनुकूल घटकों लेकिन एक पूर्व लोडर (गैर अद्यतन) ActiveX घटक के रूप में अच्छी तरह से काम करने के लिए सक्षम हो सकता है के साथ ऊपर कर सकते हैं।

मैं COM सामान को संभालने के लिए .NET/mscoree.dll पर भरोसा कर रहा हूं, इसलिए निचले स्तर पर एक क्लीनर विधि हो सकती है।

विभिन्न "संस्करण" को एचपीसीयू \ सॉफ्टवेयर \ कक्षा संरचना में अस्थायी भार के साथ संभाला जाता है।

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

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