c# ActiveX DLL त्रुटि



visual-studio-2010 (1)

मैं इस कार्य को आईई और वीबीएससीपी के माध्यम से निम्न कार्य कर रहा था:

  1. 'एक्टिक्स्टस्टेस्ट' नामक नेट क्लास लाइब्रेरी बनाएं
  2. MyObject नामक वर्ग को जोड़ें, जिसे निम्न प्रकार से परिभाषित किया गया है:

    namespace ActiveXTest
    {
        [System.Runtime.InteropServices.ComVisible(true)]
        [System.Runtime.InteropServices.ProgId("ActiveXTest.MyObject")]
        [System.Runtime.InteropServices.Guid("df2dac4d-ba8a-4ecc-b76e-958c1bc32f1f")]
        public class MyObject
        {
            public string HelloWorld()
            {
                return "This is Hello World from the COM component!";
            }
        }
    }
  3. कक्षा को संकलित करें उस फ़ोल्डर पर जाएं जहां आपने कक्षा संकलित की थी और एक Visual Studio कमांड प्रॉम्प्ट से निम्न करें: regasm / codebase ActiveXTest.dll

  4. .vbs स्क्रिप्ट से परीक्षण करने के लिए, नोटपैड कॉल test.vbs में एक फ़ाइल बनाएं। फ़ाइल में निम्नलिखित टाइप करें:

    Dim myObject
    set myObject = CreateObject("ActiveXTest.MyObject")
    MsgBox(myObject.HelloWorld)

एक कमांड प्रॉम्प्ट खोलें और जहां पर आपने टेस्ट। वीबीएस और प्रकार बनाया: wscript test.vbs एक संवाद दिखाना चाहिए "यह COM घटक से हेलो वर्ल्ड है"

  1. IE से इसका परीक्षण करने के लिए, मैंने निम्न सामग्री के साथ एक TEST.HTML फ़ाइल बनाई है:

    <HTML>
        <HEAD>
            <script language="JScript" language="JavaScript">
              var obj = new ActiveXObject("ActiveXTest.MyObject");
              alert(obj.HelloWorld());          
            </script>
        </HEAD>
    
       <body>
           <span>nothing to see here!</span>
       <body>
    </HTML>

IE में परीक्षण। HTML फ़ाइल खोलें आपको ActiveX नियंत्रण के बारे में एक चेतावनी मिलेगी; बस हां कहें तो बातचीत की अनुमति दें। आपको एक चेतावनी संवाद मिलेगा जिसमें "ये हैलो वर्ल्ड द कॉम कॉम्पोनेंट" है।

समान चरणों का इस्तेमाल इसे .js फ़ाइल से या एक्सेल VBA से करने के लिए किया जा सकता है। ध्यान दें कि यदि आप ActiveX असेंबली के COM विधि हस्ताक्षर को बदलते हैं तो मुझे विश्वास है कि आपको इसे पुनः पंजीयन करना होगा।

ठीक है जब मैंने 2012 में कभी नहीं सोचा था कि मैं अपना पहला एक्टिवक्स नियंत्रण लिख रहा हूं (और हाँ इसके लिए एक अच्छा कारण है) मैं इसे विंडोज 7 (एक्स 64) के तहत चलाने के लिए संघर्ष कर रहा हूं।

समाधान शॉर्ट स्टोरी: मैं अपने कुछ रेसस्म कॉल से लापता / कोडबेस था और 32 और 64 बिट प्रक्रियाओं को भी मिलाया, लेकिन मानक VS2010 कमांड प्रॉम्प्ट से इसकी सहायता नहीं की जा रही थी और 32 और 64 बिट पथ रेज़ेसम और सीएसक्रिप्ट ।

लंबी कहानी इस प्रकार है:

मैं बीच में उछल रहा था

सी में सी # में ActiveX नियंत्रण बनाना।

( उफ़ मेरे पास गलत लिंक था .. हालांकि ऐसा लगता है कि मैंने शुरू में दिए गए लिंक की तरह मूल ब्लॉग पेज की प्रतिलिपि बनाई थी)

सी में सी # में ActiveX नियंत्रण बनाना।

तथा

सी # ActiveX नियंत्रण (सीएसएक्टिवएक्स)

और मैं प्रोजेक्ट सफलतापूर्वक तैयार कर रहा हूं (बाद के लिए मुझे संसाधन कंपाइलर स्थान को सही स्थान पर बदलना पड़ा)।

पहली परियोजना के लिए मैं सुझाए गए इंस्टॉलर का उपयोग कर रहा हूं, दूसरी परियोजना के लिए मैं रेज़ेस का सीधे उपयोग करने का प्रयास कर रहा हूं।

लेकिन इसके बाद यह सब पहाड़ी नीचे चला गया। मैं सभी की कोशिश करता हूं और पंजीकृत हूं, या तो:

  1. मुझे नहीं पता है कि मुझे उनका पंजीकरण कैसे करना चाहिए, या:
  2. मुझे नहीं पता कि मुझे उन्हें कैसे दर्ज करना चाहिए।

मेरा परीक्षण केस एक साधारण जेस्क्रिप्ट फ़ाइल है जिसमें

var x = new ActiveXObject( "name of object" );

जो त्रुटि के साथ विफल रहता है:

test.js (1,1) माइक्रोसॉफ्ट जेस्क्रिप्ट रनटाइम त्रुटि: स्वचालन सर्वर ऑब्जेक्ट नहीं बना सकता

मुझे यकीन नहीं है कि यह एक अनुमति मुद्दा है या 32 बिट 64 बिट समस्या या एक संयोजन है।

ActiveX पर मदद देने वाली कई साइटें मान रही हैं कि आप इसे वेब पेज के माध्यम से एक्सेस करेंगे, इसलिए मैंने IE अनुमतियों को देखने का प्रयास किया है (हालांकि मैं 3 भाग के कार्यक्रम में नियंत्रण लोड करना चाहता हूं)।

मुझे पता है कि क्या मैं 'फ्रेमवर्क' या 'फ्रेमवर्क 64' रेज़म्स के संस्करणों का उपयोग कर सकता हूं, जहां मैं रजिस्ट्री प्रविष्टियों में डाल सकता हूं - और मैंने सीएसपीआर चलाने के लिए कुछ संदर्भ 32 या 64 बिट के रूप में देखे हैं (जो संभवतः किस भाग को प्रभावित करता है रजिस्ट्री की खोज की जाती है) सीएमडी खोल के आधार पर लागू (और मैंने दोनों तरीकों से कोशिश की है, साथ ही साथ "व्यवस्थापक" खोल की कोशिश कर रहा है)।

इसलिए मूल रूप से इस बिंदु पर मुझे नहीं पता कि मैं क्या कर रहा हूं या मुझे क्या करना चाहिए।

मेरा लक्ष्य विंडोज 7 एक्स 64 पर एक ActiveX नियंत्रण पंजीकृत करना है और इसे इसके द्वारा लोड किया जा सकता है:

  1. डिफ़ॉल्ट Windows कमांड प्रॉम्प्ट से एक परीक्षण .js स्क्रिप्ट चल रहा है
  2. एक्सेल 2007 VBA की तरह कुछ ही नियंत्रण लोड करें (केवल परीक्षण के लिए)
  3. 3 भाग के आवेदन (रॉकवेल से आरएसवीयूआई स्टूडियो) में नियंत्रण लोड करें और इसे एक वीबीए एप्लीकेशन के भीतर होस्ट किया है (और मुझे यह जांचना होगा कि यह आईएसए 32 या 64 बिट प्रोग्राम है .. मुझे पूर्व में संदेह है)

टिप्पणियाँ

प्रोजेक्ट के लिए कि उपयोगकर्ता इंस्टॉलर (सीनेट # का उपयोग करते हुए नेट में एक ActiveX नियंत्रण बनाना), यह कोड को "c: \ program files (x86) \" में स्थापित करता है और regedit के साथ में मुझे "कंप्यूटर \ HKEY_CLASSES_ROOT \ Wow6432Node \ सीएलएसआईडी \ "जो मुझे विश्वास है कि मुझे बता रहा है कि डीएलएल को 32 बिट प्रक्रिया के रूप में स्थापित किया गया था। मैंने अपने सीएसक्रिप्ट परीक्षण को 32 और 64 बिट सीएमडी दोनों से चलाने की कोशिश की है और वे दोनों विफल हो गए हैं। नोट करें कि इंस्टॉलर "रेसमम / कोडेबेस" के समतुल्य बना रहा था, जब यह काम करता था।

इस प्रोजेक्ट के लिए जहां मुझे regasm (सी # एक्टिव एक्स नियंत्रण (सीएसएक्टिवएक्स)) रजिस्टर करने के लिए उपयोग करने की कोशिश की गई थी, उसमें एक ActiveX COM नियंत्रण पंजीकरण के लिए कुछ अतिरिक्त कोड है इस कोड में 32 बिट इन-प्रोसेस सर्वर पंजीकृत हैं (देखें ActiveXCtrlHelpers.cs)

(बीटीडब्लूडब्लू, मैं सफ़ारी / शेर में स्वत: सही को धीमा कर रहा हूं, इस समय कम केस "डीएलएल" को "सभी" में बदलता रहता है)

2012-08-07 को संपादित करें

कला के जवाब से मुझे पता चला:

मानक VS2010 कमांड प्रॉम्प्ट से

मानक VS2010 कमांड प्रॉम्प्ट के माध्यम से 'regasm / codebase' चलाते समय (और नियंत्रक को परिवर्तन करने के लिए अनुमति देने के लिए व्यवस्थापक के रूप में), प्रविष्टियों को HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID के अंतर्गत रजिस्ट्री में मिला दिया गया था और परीक्षा स्क्रिप्ट एक ही प्रॉम्प्ट से विफल हुई थी।

हालांकि मैं Excel 2007 (32 बिट) में ActiveX नियंत्रण देख सकता हूं

X64 से Win64 VS2010 कमांड प्रॉम्प्ट से

जब VS2010 x64 विन 64 कमांड प्रॉम्प्ट (फिर व्यवस्थापक के रूप में) के तहत चल रहे रजिस्ट्री प्रविष्टियां HKEY_CLASSES_ROOT \ CLSID के अंतर्गत प्रकट हुईं लेकिन इस समय परीक्षण स्क्रिप्ट एक ही प्रॉम्प्ट से और एक मानक Windows cmd prompt से (हालांकि वे 32 बिट प्रॉम्प्ट से विफल हो )

परंतु!! मैं एक्सेल 2007 (32 बिट) से सक्रिय एक्स नियंत्रण नहीं देख सकता

अब मुझे बस यह पता करने की आवश्यकता है कि खिड़कियों के बराबर * निकस 'कमांड' को यह सुनिश्चित करने के लिए कि मैं किस नियम का उपयोग कर रहा हूं) 'जहां' कमांड

VS2010 और Windows 7 कमांड प्रॉम्प्ट को देखते हुए:

    VS2010 (standard prompt): cscript => c:\windows\system32\cscript.exe
                              regasm  => c:\windows\Microsoft.net\framework\v4.0.30319\regasm.exe

    VS2010 (x64 Win 64):      cscript => c:\windows\system32\cscript
                              regasm  => c:\windows\Microsoft.net\framework64\v4.0.30319\regasm.exe

    Windows 7  std. prompt:   cscript => c:\windows\system32\cscript.exe

    Windows 7 32 bit prompt:  cscript => c:\windows\SysWOW64\cscript.exe

यह सब कुछ मेरे भ्रम की समझ को समझने के लिए शुरू कर रहा है। मैं अनजाने में 32 और 64 बिट सिस्टमों को मिलाकर और मिलान कर रहा हूं, लेकिन VS2010 मानक प्रॉम्प्ट या तो मदद नहीं करता!

(और मेरी नवीनतम झंझट - वी.एस. 22010 को बीओएम के साथ यूटीएफ -8 के रूप में फाइलें सहेजना)





activex