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

Popular posts from this blog

c++ - How do I get a multi line tooltip in MFC -

asp.net - In javascript how to find the height and width -

c# - DataTable to EnumerableRowCollection -