2008-09-14 4 views
8

मान लीजिए मैं एक COM वस्तु उन जैसे एक कॉल के माध्यम से उपयोग कर सकते हैं जो है:मेरी कॉम वस्तु की VBScript उपयोगकर्ताओं के लिए एक ईवेंट हैंडलर बेनकाब

Set s = CreateObject("Server") 

मैं ऐसा करने में सक्षम होना चाहते हैं क्या अनुमति देते हैं (विशेष रूप से 2007 बीसीबी)

Function ServerEvent 

    MsgBox "Event handled" 

End Function 

s.OnDoSomething = ServerEvent 

यह संभव है और, यदि हां, मैं कैसे यह मेरी प्रकार लायब्रेरी में सी में प्रदर्शित करूं ++: उपयोगकर्ता वस्तु के लिए एक ईवेंट हैंडलर निर्दिष्ट करने के लिए है, इसलिए पसंद है?

उत्तर

1

मैं विवरण पर थोड़ा धुंधला कर रहा हूँ, लेकिन शायद नीचे दिए गए लिंक मदद कर सकता है:

http://msdn.microsoft.com/en-us/library/ms974564.aspx

ऐसा लगता है कि अपने सर्वर वस्तु IProvideClassInfo को लागू करने की जरूरत है और फिर आप अपने VBScript कोड में ConnectObject फोन की तरह । यह भी देखें:

http://blogs.msdn.com/ericlippert/archive/2005/02/15/373330.aspx

5

यह वह जगह है मैं इसे कैसे अभी हाल ही में किया था।

[ 
    object, 
    uuid(6EDA5438-0915-4183-841D-D3F0AEDFA466), 
    nonextensible, 
    oleautomation, 
    pointer_default(unique) 
] 
interface IServerEvents : IDispatch 
{ 
    [id(1)] 
    HRESULT OnServerEvent(); 
} 

//... 

[ 
    uuid(FA8F24B3-1751-4D44-8258-D649B6529494), 
] 
coclass ServerEvents 
{ 
    [default] interface IServerEvents; 
    [default, source] dispinterface IServerEvents; 
}; 

यह CServerEvents वर्ग की घोषणा है: एक अंतरफलक है कि आपके आईडीएल है कि इंटरफेस के लिए IDispatch और एक coclass लागू करता जोड़े

class ATL_NO_VTABLE CServerEvents : 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CServerEvents, &CLSID_ServerEvents>, 
    public IDispatchImpl<IServerEvents, &IID_IServerEvents , &LIBID_YourLibrary, -1, -1>, 
    public IConnectionPointContainerImpl<CServerEvents>, 
    public IConnectionPointImpl<CServerEvents,&__uuidof(IServerEvents)> 
{ 
public: 
    CServerEvents() 
    { 
    } 

    // ... 

BEGIN_COM_MAP(CServerEvents) 
    COM_INTERFACE_ENTRY(IServerEvents) 
    COM_INTERFACE_ENTRY(IDispatch) 
    COM_INTERFACE_ENTRY(IConnectionPointContainer) 
END_COM_MAP() 

BEGIN_CONNECTION_POINT_MAP(CServerEvents) 
    CONNECTION_POINT_ENTRY(__uuidof(IServerEvents)) 
END_CONNECTION_POINT_MAP() 

    // .. 

    // IServerEvents 
    STDMETHOD(OnServerEvent)(); 

private: 
    CRITICAL_SECTION m_csLock;   
}; 

कुंजी यहाँ IConnectionPointImpl और IConnectionPointContainerImpl के कार्यान्वयन है इंटरफेस और कनेक्शन बिंदु मानचित्र। OnServerEvent विधि की परिभाषा इस तरह दिखता है:

STDMETHODIMP CServerEvents::OnServerEvent() 
{ 
    ::EnterCriticalSection(&m_csLock); 

    IUnknown* pUnknown; 

    for (unsigned i = 0; (pUnknown = m_vec.GetAt(i)) != NULL; ++i) 
    {  
     CComPtr<IDispatch> spDisp; 
     pUnknown->QueryInterface(&spDisp); 

     if (spDisp) 
     { 
      spDisp.Invoke0(CComBSTR(L"OnServerEvent")); 
     } 
    } 

    ::LeaveCriticalSection(&m_csLock); 

    return S_OK; 
} 

आप अपने ग्राहक अपने घटनाओं के लिए उनके हैंडलर निर्दिष्ट करने के लिए के लिए एक तरीका प्रदान करने की जरूरत है। आप इसे "सेटहैंडलर" या कुछ जैसी समर्पित विधि के साथ कर सकते हैं, लेकिन मैं हैंडलर को उस विधि के लिए तर्क देना पसंद करता हूं जिसे अतुल्यकालिक कहा जाता है। इस तरह, उपयोगकर्ता केवल एक विधि कॉल करने के होते हैं:

STDMETHOD(DoSomethingAsynchronous)(IServerEvents *pCallback); 

स्टोर IServerEvents सूचक, और उसके बाद जब आप अपने ईवेंट को सक्रिय करना चाहते हैं, तो बस फोन विधि:

m_pCallback->OnServerEvent(); 

का सवाल है VB कोड, घटनाओं से निपटने के लिए वाक्य रचना तुम क्या सुझाव दिया की तुलना में थोड़ा अलग है:

Private m_server As Server 
Private WithEvents m_serverEvents As ServerEvents 

Private Sub MainMethod() 
    Set s = CreateObject("Server") 
    Set m_serverEvents = New ServerEvents 

    Call m_searchService.DoSomethingAsynchronous(m_serverEvents) 
End Sub 

Private Sub m_serverEvents_OnServerEvent() 
    MsgBox "Event handled" 
End Sub 

मुझे आशा है कि इस मदद करता है।

+1

आपके द्वारा प्रदान किया गया कोड वीबी सिंटैक्स है, वीबीस्क्रिप्ट नहीं। "जैसा" कीवर्ड, और "WithEvents" VBScript में उपलब्ध नहीं हैं। –

+0

@ 1800 जानकारी, ठीक है आप हैं। मैंने वीबी और वीबीस्क्रिप्ट दोनों का उपयोग किया है, लेकिन यह लंबे समय से रहा है क्योंकि मैंने वीबीस्क्रिप्ट के साथ कुछ भी किया है। मैं भूल गया था या उस विशेष अंतर से अवगत नहीं था। –

+0

@ जेफहिलमैन, प्रदान किया गया समाधान सी ++ के लिए है। अब मेरे पास एक समान आवश्यकता है, लेकिन ActiveX COM के लिए सी # के माध्यम से विकसित किया गया है (हमारे पास इसके लिए स्रोत कोड है)। क्या आपको पता है कि सी #/नेट नेट के लिए समान दृष्टिकोण है? – user908645

2

मैं here वर्णित तकनीक के बाद समाप्त हुआ।

+0

यह शायद बहुत से का सबसे अच्छा जवाब है –

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