2010-08-16 14 views
5

मैं कैसे एक स्क्रिप्ट ActiveX नियंत्रण लिखने के लिए सीख रहा हूँ एक विधि है कि के लिए एक सरल ActiveX नियंत्रण लिख रहा है। मेरा लक्ष्य एक छोटा सा नियंत्रण रखना है जो यह देखने के लिए जांच सकता है कि सिस्टम पर कुछ स्थापित है या नहीं। क्या मैं अब तक क्या किया है है:आईई

  • में VS2008 एक MFC ActiveX नियंत्रण प्रोजेक्ट बना
  • कुछ 'स्क्रिप्टिंग के लिए सुरक्षित' बिट्स कि मैं here पाया जोड़ें।
  • मेरी "IsInstalled" विधि है, जो अब के लिए बिना शर्त सही रिटर्न प्रदान करने के लिए आईडीएल का विस्तार (लेकिन बाद में रजिस्ट्री से कुछ सुझाव दिए प्रदर्शित करेगा।)
  • नियंत्रण और उस पर रन regsvr32 बनाएँ। मैं सत्यापित है कि यह HKEY_CLASSES_ROOT में दिखाई देती है, और जब मैं वस्तु का दृष्टांत, IE डेवलपर टूल "स्थानीय लोगों" फलक पता चलता है कि ऑब्जेक्ट प्रकार _D [मेरे प्लगइन का नाम] की है। इतना ही नहीं, लेकिन मेरी IsInstalled() विधि उस वस्तु के नीचे दिखाई देती है।

हालांकि, जब मैं IsInstalled() कहते हैं, मैं तो बस नहीं यह काम करने के लिए प्राप्त कर सकते हैं:

JScript Debugger - Breaking on JScript runtime error -(n http://img138.imageshack.us/img138/1586/whycomwhy.png

मैं एक नुकसान में हूँ। मैंने IDL में BOOL के बजाय बूलियन के बजाय VARIANT_BOOL का उपयोग करके, विधि के बजाय एक संपत्ति के बजाय IsInstalled को बनाने का प्रयास किया है, आप इसे नाम दें।

यहाँ कोड के प्रासंगिक अंश है।

हैडर:

afx_msg VARIANT_BOOL IsInstalled(); 

कार्यान्वयन:

afx_msg VARIANT_BOOL 
CMyAXCtrl::IsInstalled() 
{ 
    return TRUE; 
} 

प्रेषण नक्शा:

BEGIN_DISPATCH_MAP(CMyAXCtrl, COleControl) 
    DISP_FUNCTION_ID(CMyAXCtrl, "IsInstalled", dispidIsInstalled, IsInstalled, VT_BOOL, VTS_NONE) 
END_DISPATCH_MAP() 

आईडीएल के प्रेषण हिस्सा:

[ uuid(6B662202-CF13-4144-AA33-C3FEE9C2C962), 
     helpstring("Dispatch interface for My Control")] 
    dispinterface _Daxplugin 
    { 
    properties: 
    methods: 
     [id(1)] VARIANT_BOOL IsInstalled(); 
    }; 

यदि कोड के किसी अन्य प्रासंगिक बिट्स को मुझे प्रदान करना चाहिए, तो मुझे बताएं। लेकिन मैं यहाँ फंस गया हूँ। आपका अग्रिम में ही बहुत धन्यवाद!

+0

आपको प्राप्त होने वाली जेस्क्रिप्ट रनटाइम त्रुटि क्या है? आपकी तस्वीर सिर्फ "(एन", जो बहुत उपयोगी नहीं है। –

+0

यह वही है जो मैं कर रहा हूं। मैं पूर्ण रनटाइम त्रुटि को दिखाने का तरीका नहीं समझ सकता। वैसे भी, नीचे मेरी टिप्पणी देखें - यह एक महत्वपूर्ण बिंदु है अब –

उत्तर

3

आप लगभग निश्चित रूप से एक स्क्रिप्ट समारोह के लिए गलत प्रोटोटाइप है। स्क्रिप्टिंग भाषाओं के लिए ओएलई ऑटोमेशन वास्तविक रिटर्न कोड के लिए आउट पैरामीटर का उपयोग करके HRESULT को वापस करने पर भरोसा करता है।

तो [id(1)] HRESULT IsInstalled(VARIANT_BOOL* p);

भी सच के लिए इसे बदल! = VARIANT_TRUE, आप VARIANT_TRUE लौटना चाहिए जो करने के लिए -1 के बजाय 1.

आशा है कि में से कुछ वास्तव में मदद करता है के बराबर है, लेकिन वास्तविक त्रुटि के बिना मुझे गलत हो सकता है :)

+0

मैंने एटीएल में पूरी चीज को फिर से लिखना समाप्त कर दिया, जिसमें एक स्पष्ट इंटरफ़ेस है सुरक्षित-स्क्रिप्टिंग बिट्स को कार्यान्वित करना, और मैंने खुद को इस HRESULT मुद्दे को खोज लिया। हालांकि, इस कारण से मुझे यकीन नहीं है कि मैं वास्तव में बक्षीस देना चाहता हूं क्योंकि मैंने इसे अपने ओ पर समझ लिया था wn। फिर भी धन्यवाद। –

0

आप अपने नियंत्रण IObjectSafety को लागू करने से या जबकि यह दर्ज की (के रूप में लिंक आपके द्वारा दी गई द्वारा माना जाता) को बचाने के रूप में वस्तु चिह्नित करके स्क्रिप्टिंग के लिए बचाने के रूप में चिह्नित कर सकते हैं।

आप इसे पटकथा को बचाने के लिए चिह्नित करने के लिए कोड जोड़ने के बाद regsvr32 चलाने है?

यदि आपके नियंत्रण में स्क्रिप्टिंग बिट सेट के लिए सुरक्षित है तो आप रजिस्ट्री की जांच कर सकते हैं। बिट्स सेट कर रहे हैं, तो आप अपनी वस्तु में ImplementedCategories की उपकुँजियाँ के रूप में दो चाबियाँ {7DD95802-9882-11CF-9FA9-00AA006C42C4} (Safe for Initialization) {7DD95801-9882-11CF-9FA9-00AA006C42C4}(Safe For Scripting) मिल जाएगा।

मैं IObjectSafety को लागू करने का सुझाव दूंगा क्योंकि यह आपके वर्ग पर स्वयं पंजीकृत होने पर निर्भर नहीं है।

+0

मैंने कोडप्रोजेक्ट से उदाहरण प्रोजेक्ट का उपयोग किया, जिसमें उन दो सीएलएसआईडी के मैन्युअल पंजीकरण शामिल हैं। स्क्रिप्टिंग सुरक्षा चीज कोई मुद्दा नहीं है, या मैं ऑब्जेक्ट को तुरंत चालू नहीं कर पाता। समस्या बाद में होती है। –

+0

अगर मैं सही दस्तावेज को समझता हूं, तो IE ActiveX नियंत्रण को सक्रिय करेगा लेकिन स्क्रिप्ट से एक्सेस की अनुमति नहीं देगा अगर उसे स्क्रिप्टिंग विशेषताओं के लिए सुरक्षित नहीं मिलता है। –