Jim Fawcett CSE775 – Distributed Objects Spring 2007 ActiveX Controls Jim Fawcett CSE775 – Distributed Objects Spring 2007
What is an ActiveX Control? Com Component A COM component User Interface Has thread affinity, must live in an STA Derives from CComObjectRootEx<CComSingleThread-Model> Creatable class Derives from CComCoClass Provides IClassFactory interface
What is an ActiveX Control? Properties, callbacks, change notifications Has stock and custom properties and methods Implements IDispatch interface Stock and custom event callbacks Supports connection points dispinterface, IConnectionPointContainer, IConnectionPoint, IProvideClassInfo2 Property change notifications IPropertyNotifySink, connection points
What is an ActiveX Control? Control behavior On-demand rendering of view IViewObject, IViewObject2, IViewObjectEx Standard control behavior IOleControl In-place activation IOleObject, IOleInPlaceActiveObject
What is an ActiveX Control? Persistence and Drag-and-Drop Persistence support for containers IPersistStreamInit, IPersistPropertyBag, IPersistStorage Drag and Drop support IDataObject, IDropSource, IDropTarget
What is an ActiveX Control? Design-Time Support Provide property pages ISpecifyPropertyPages Property browsing from container IPerPropertyBrowsing Arrange properties by category ICategorizeProperties
Control Types “Standard” ActiveX control Composite Control A container and a control HTML Control Uses same webBrowser control as IE
What is a Control Container? Provides a window Acts as parent for the child COM control Provides means for user to communicate with control, e.g., button-click, mouse-move, … Support a set of COM interfaces that control uses to communicate with container
What is a Control Container? Basic containment Control creation CAxHostWindow has the base classes CComCoClass CComObjectRootEx<CComSingleThreadModel> CWindowImpl IOleClientSite IOleInPlaceSiteWindowless IOleControlSite IOleContainer IObjectWintSiteImpl IServiceProvider IAdviseSink
Container Window Since the container provides a window for the control, you can do all the usual window things with it by sending windows messages: Resize and move Show and hide CAxWindow provides a QueryControl method to obtain the control’s interface HRESULT QueryControl(REFIID iid, void** ppUnk);
Sinking a Control’s Events Connection Pointer interfaces dispinterface, not dual interface, so container can’t just derive from, and implement those source interfaces IDispatchImpl<nID, T, pdiid> Derive once of each control Uses BEGIN_SINK_MAP, SINK_ENTRY, END_SINK_MAP Call IConnectionPointContainer, IConnectionPoint, IAdvise to establish link Uses HRESULT AtlAdviseSinkMap(T* pT, bool bAdvise);
Sinking Control’s Property Notifications Control defines IPropertyNotify interface Request permission to change a property Notify of a property change IPropertyNotify is a dual interface Container just inherits and implements No need for sink map and IDispatchImpl Implement STDMETHODIMP OnRequestEdit(DISPID dispID) { return S_OK; } STDMETHODIMP OnChanged(DISPID dispID) { m.bDirty = true; return S_OK; }