2009-11-17 13 views
6

मैं एक ActiveX नियंत्रण विकसित करना चाहता हूं और क्योंकि मेरे पास विजुअल स्टूडियो नहीं है, मैं सोच रहा हूं कि क्या मैं विजुअलसी ++ एक्सप्रेस संस्करण का उपयोग अपने आप कर सकता हूं, या मुझे विंडोज प्लेटफ़ॉर्म एसडीके की भी आवश्यकता है?एक्टिवएक्स नियंत्रण विकसित करना

+0

मैं कुलपति ++ एक्सप्रेस संस्करण स्थापित नहीं है। जब आप "फ़ाइल> नया> प्रोजेक्ट ..." चुनते हैं तो यह आपको क्या विकल्प देता है? – ChrisF

+0

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

उत्तर

11

आपको सक्रिय एक्स नियंत्रण लिखने के लिए विजुअल स्टूडियो की आवश्यकता नहीं है। एक सक्रिय एक्स नियंत्रण केवल एक COM ऑब्जेक्ट है जो एक विशिष्ट तरीके से पंजीकृत होता है जो IU अज्ञात और IObjectSafety लागू करता है।

आपको विजुअल स्टूडियो सक्रिय एक्स प्रोजेक्ट बनाने की आवश्यकता नहीं है। आप केवल एक सामान्य डीएलएल बना सकते हैं, उचित मैनिफेस्ट जोड़ सकते हैं और सीएबी एसडीके उपकरण का उपयोग कर इसे कैब कर सकते हैं।

आपको सक्रिय एक्स नियंत्रण लिखने के लिए एटीएल का उपयोग करने की आवश्यकता नहीं है। वास्तव में, जब तक आप समझते हैं कि ओईई इंटरफेस आईई एक्स्टेंसिबिलिटी मॉडल में कैसे काम करता है, तब तक आप इसका उपयोग नहीं कर सकते हैं।

तो हाँ, आप विजुअल स्टूडियो एक्सप्रेस के साथ ठीक होंगे।

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

  • आप Introduction to Active X Controls साथ शुरू करना चाहिए।
  • यहां CAB SDK है।
  • आप आदि गूगल खोज के द्वारा बुनियादी ActiveX नियंत्रण के लिए उदाहरण खोजने कोई समस्या नहीं,

यहां एक नमूना प्रकट, YOURCONTROL.inf कहा जाता है होना चाहिए। स्पष्ट रूप से YOURCONTROL को जो कुछ भी आप अपने लड़के कहते हैं उसे प्रतिस्थापित करें, और अपना स्वयं का GUID और संस्करण संख्याएं उत्पन्न करें। यह न्यूनतम मेनिफेस्ट है जिसकी आपको आवश्यकता होगी।

[version] 
signature="$CHICAGO$" 
AdvancedINF=2.0 

[Add.Code] 
YOURCONTROL.dll=YOURCONTROL.dll 

[YOURCONTROL.dll] 
file-win32-x86=thiscab 
clsid={11111111-2222-3333-4444-555555555555} 
FileVersion=1,2,3,4567 
RegisterServer=yes 

आप अपने परियोजना है कि कॉम और आत्म पंजीकरण के लिए आवश्यक निर्यात कार्यों को सूचीबद्ध करता है में एक मानक .def फ़ाइल की आवश्यकता होगी। DllGetClassObject वह जगह है जहां COM आपको COM COM ऑब्जेक्ट के लिए क्लास फ़ैक्टरी प्राप्त करने के लिए कॉल करेगा। RegisterServer और UnregisterServer वह जगह है जहां आपको रजिस्ट्री में अपना प्रारंभिक स्थिति लिखना चाहिए (उदा। आपका COM ऑब्जेक्ट पंजीकरण, आदि)।

EXPORTS 
    DllCanUnloadNow    PRIVATE 
    DllGetClassObject PRIVATE 
    DllRegisterServer PRIVATE 
    DllUnregisterServer PRIVATE 

आप तो आप अपने COM ऑब्जेक्ट के dispinterface तो यह स्क्रिप्ट से ही कॉल किया जा सकता है परिभाषित कर सकते हैं एक आईडीएल फ़ाइल बहुत, की आवश्यकता होगी, और इसलिए यह जावास्क्रिप्ट को घटनाओं आग कर सकते हैं।कुछ इस तरह:

import "oaidl.idl"; 
import "ocidl.idl"; 

#include "dispids.h" // <-- define your DISPIDs here 

[ 
     uuid(<<generate your own guid here>>), 
     version(1.0), 
] 
library YOURCONTROLLIBRARY 
{ 
    [ 
     uuid(<<generate your own guid here>>), 
     hidden 
    ] 
    dispinterface DYOURCONTROLEvents 
    { 
     properties: 
     methods: 
     // Add outgoing events here. 
     [id(DISPID_SOME_EVENT)] void SomeEvent(); 
    } 

    [ 
     dual, 
     uuid(<<generate your own guid here>>) 
    ] 
    interface IYOURCONTROL : IDispatch 
    { 
     // Add methods and properties here. 
     [id(DISPID_SOMEMETHOD)] HRESULT SomeMethod([in] BSTR bstrFoo); 
    } 

    [ 
     uuid(<<generate your own guid here>>) 
    ] 
    coclass YOURCONTROLCtl 
    { 
     [default] interface IYOURCONTROL; 
     [source, default] dispinterface DYOURCONTROLEvents; 
    } 
} 

और अंत में, अपने DLL प्रवेश बिंदु कुछ इस तरह दिखना चाहिए:

HINSTANCE g_hInstance; 
LONG g_nDllRefs; 

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { 
    switch (dwReason) { 
     case DLL_PROCESS_ATTACH: 
      g_hInstance = hInstance; 
      g_nDllRefs = 0; 
      break; 

     case DLL_PROCESS_DETACH: 
      break; 
    } 

    return true; 
} 

// Call this whenever you create your object to keep your DLL loaded. 
void DllAddRef() { 
    InterlockedIncrement(&g_nDllRefs); 
} 

// Call this when your object is destroyed. 
void DllRelease() { 
    InterlockedDecrement(&g_nDllRefs); 
} 

STDAPI DllCanUnloadNow() { 
    return (g_nDllRefs == 0 ? S_OK : S_FALSE); 
} 

// This is where you create your class factory. See the IClassFactory documentation on msdn. 
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { 
    HRESULT hr; 
    if (rclsid == CLSID_YOUROBJECTCtl) { 
     CYOUROBJECTFactory *pYOUROBJECTFactory = new CYOUROBJECTFactory; 
     if (pYOUROBJECTFactory == NULL) { 
      hr = E_OUTOFMEMORY; 
     } else { 
      hr = pYOUROBJECTFactory ->QueryInterface(riid, ppv); 
     } 
    } else { 
     hr = CLASS_E_CLASSNOTAVAILABLE; 
    } 
    return hr; 
} 

STDAPI DllRegisterServer() { 
    // Write your registry keys for registering your ActiveX COM Object here. 
    return S_OK; 
} 

STDAPI DllUnregisterServer() { 
    // Delete your registry keys here. 
    return S_OK; 
} 
+0

बहुत बहुत धन्यवाद। क्या आप मुझे एक लिंक प्रदान कर सकते हैं जो प्रक्रिया का वर्णन करता है और सरल उदाहरण देता है? – Matt

+0

तब वह कैसा है? –

+0

धन्यवाद। यह एक शानदार शुरुआत है। – Matt

0

यह Microsoft Support post 2006 से होगा इंगित करता है कि आप ActiveX के विकास के लिए कुलपति ++ एक्सप्रेस संस्करण का उपयोग कर सकते नियंत्रित करता है: जब साथ प्रयोग किया

माइक्रोसॉफ्ट ActiveX टेम्पलेट लायब्रेरी 3.0, के लिए लागू:
माइक्रोसॉफ्ट विज़ुअल सी ++ 6.0 एंटरप्राइज़ संस्करण
माइक्रोसॉफ्ट विजुअल सी ++ 6.0 व्यावसायिक संस्करण
माइक्रोसॉफ्ट विजुअल सी ++, 32-बिट लर्निंग संस्करण 6.0
माइक्रोसॉफ्ट विजुअल C++ 2005 एक्सप्रेस संस्करण
माइक्रोसॉफ्ट विजुअल C++ .NET 2003 मानक संस्करण
माइक्रोसॉफ्ट विजुअल C++ .NET 2002 मानक संस्करण

के बाद से मैं ActiveX का उपयोग करके विकसित यह एक समय हो गया है, लेकिन मुझे याद नहीं विंडोज प्लेटफार्म एसडीके स्थापित करने के लिए।

+2

मुझे नहीं लगता कि पृष्ठ सही है। पृष्ठ इंगित करता है कि नमूना एटीएल का उपयोग करता है और यह विज़ुअल सी ++ एक्सप्रेस संस्करण से गुम चीजों में से एक है। – Matt

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