Expose an event handler to VBScript users of my COM object -
suppose have com object users can access via call such as:
set s = createobject("server")
what i'd able allow user specify event handler object, so:
function serverevent msgbox "event handled" end function s.ondosomething = serverevent
is possible and, if so, how expose in type library in c++ (specifically bcb 2007)?
this how did recently. add interface implements idispatch , coclass interface idl:
[ 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; };
this declaration of cserverevents class:
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; };
the key here implementation of iconnectionpointimpl , iconnectionpointcontainerimpl interfaces , connection point map. definition of onserverevent method looks this:
stdmethodimp cserverevents::onserverevent() { ::entercriticalsection( &m_cslock ); iunknown* punknown; ( unsigned = 0; ( punknown = m_vec.getat( ) ) != null; ++i ) { ccomptr<idispatch> spdisp; punknown->queryinterface( &spdisp ); if ( spdisp ) { spdisp.invoke0( ccombstr( l"onserverevent" ) ); } } ::leavecriticalsection( &m_cslock ); return s_ok; }
you need provide way client specify handler events. can dedicated method "sethandler" or something, prefer make handler argument method called asynchronously. way, user has call 1 method:
stdmethod(dosomethingasynchronous)( iserverevents *pcallback );
store pointer iserverevents, , when want fire event, call method:
m_pcallback->onserverevent();
as vb code, syntax dealing events little different suggested:
private m_server server private withevents m_serverevents 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
i hope helps.
Comments
Post a Comment