Pass ATL/ActiveX object events to javascript
Hi,
I'm pretty new to ATL development and I have a activeX ATL control embeded
in an html page. The page also defines some javascript which I'd like to call
from my ActiveX object (ATL control). From reading several articles I realize
I could to use connectionpoints to accomplish this. However, I'm stuck with
a compile error:
error C2787: '_IWebPluginControlEvents' : no GUID has been associated with
this object.
Any help is greatly apperciated!
I have defined a connectionpoint within my IDL file as follows:
In "WebPlugin.idl"
[
uuid(FD84D4F2-4D92-48DE-9A16-0D2F1A43DD6D),
helpstring("_IWebPluginControlEvents")
]
dispinterface _IWebPluginControlEvents
{
properties:
methods:
[id(1), helpstring("method Finished")] HRESULT Finished();
};
coclass WebPluginControl
{
[default] interface IWebPluginControl;
[default, source] dispinterface _IWebPluginControlEvents;
};
I have implemented IProvideClassInfo2Imp and added the COM_ENTRIES as follows:
WebPluginControl.h
// CWebPluginControl
class ATL_NO_VTABLE CWebPluginControl :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IWebPluginControl, &IID_IWebPluginControl,
&LIBID_WebPluginLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CWebPluginControl>,
public IOleControlImpl<CWebPluginControl>,
public IOleObjectImpl<CWebPluginControl>,
public IOleInPlaceActiveObjectImpl<CWebPluginControl>,
public IViewObjectExImpl<CWebPluginControl>,
public IOleInPlaceObjectWindowlessImpl<CWebPluginControl>,
public ISupportErrorInfo,
public IPersistStorageImpl<CWebPluginControl>,
public ISpecifyPropertyPagesImpl<CWebPluginControl>,
public IQuickActivateImpl<CWebPluginControl>,
public IDataObjectImpl<CWebPluginControl>,
public IProvideClassInfo2Impl<&CLSID_WebPluginControl,
&__uuidof(_IWebPluginControlEvents), &LIBID_WebPluginLib>,
public IObjectSafetyImpl<CWebPluginControl,
INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
public IConnectionPointContainerImpl<CWebPluginControl>,
public
IConnectionPointImpl<CWebPluginControl,&__uuidof(_IWebPluginControlEvents)>,
public IPropertyNotifySinkCP<CWebPluginControl>,
public IPersistPropertyBagImpl<CWebPluginControl>,
public CComCoClass<CWebPluginControl, &CLSID_WebPluginControl>,
public CComControl <CWebPluginControl>,
public CProxy_IWebPluginControlEvents<CWebPluginControl>
BEGIN_COM_MAP(CWebPluginControl)
COM_INTERFACE_ENTRY(IWebPluginControl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IPersistPropertyBag)
COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CWebPluginControl)
CONNECTION_POINT_ENTRY(__uuidof(_IWebPluginControlEvents))
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
END_CONNECTION_POINT_MAP()
The proxy class (auto-generated) looks like:
// Wizard-generated connection point proxy class
// WARNING: This file may be regenerated by the wizard
#pragma once
template<class T>
class CProxy_IWebPluginControlEvents :
public IConnectionPointImpl<T, &__uuidof(_IWebPluginControlEvents)>
{
public:
HRESULT Fire_Finished()
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize();
for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock();
IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
if (pConnection)
{
CComVariant varResult;
DISPPARAMS params = { NULL, NULL, 0, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
};
I am using Visual Studio 2003 under windows XP SP2
MIDL compiler version 6.00.0361
Every ATL.dll on my system is versioned > 3 (not sure how to check the exect
one visual studio is using)