यह वह जगह है मैं इसे कैसे अभी हाल ही में किया था।
[
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
मुझे आशा है कि इस मदद करता है।
आपके द्वारा प्रदान किया गया कोड वीबी सिंटैक्स है, वीबीस्क्रिप्ट नहीं। "जैसा" कीवर्ड, और "WithEvents" VBScript में उपलब्ध नहीं हैं। –
@ 1800 जानकारी, ठीक है आप हैं। मैंने वीबी और वीबीस्क्रिप्ट दोनों का उपयोग किया है, लेकिन यह लंबे समय से रहा है क्योंकि मैंने वीबीस्क्रिप्ट के साथ कुछ भी किया है। मैं भूल गया था या उस विशेष अंतर से अवगत नहीं था। –
@ जेफहिलमैन, प्रदान किया गया समाधान सी ++ के लिए है। अब मेरे पास एक समान आवश्यकता है, लेकिन ActiveX COM के लिए सी # के माध्यम से विकसित किया गया है (हमारे पास इसके लिए स्रोत कोड है)। क्या आपको पता है कि सी #/नेट नेट के लिए समान दृष्टिकोण है? – user908645