如何让网页可以支持可连接点COM组件???
以下是源代码部分
class ATL_NO_VTABLE CCalc :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCalc, &CLSID_Calc>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CCalc>,
public IDispatchImpl<ICalc, &IID_ICalc, &LIBID_CALCTESTLib>,
public CProxy_ICalcEvents< CCalc >,
public IProvideClassInfo2Impl< &CLSID_Calc, NULL, &LIBID_CALCTESTLib >
{
public:
CCalc()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_CALC)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCalc)
COM_INTERFACE_ENTRY(ICalc)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CCalc)
CONNECTION_POINT_ENTRY(DIID__ICalcEvents)
END_CONNECTION_POINT_MAP()
.....
HRESULT Fire_OnResult(INT nEle1, INT nEle2)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[2];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[1] = nEle1;
pvars[0] = nEle2;
DISPPARAMS disp = { pvars, NULL, 2, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
};
但是变量 "nConnections" 跟踪得到的值是零????!!!!
class ATL_NO_VTABLE CCalc :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CCalc, &CLSID_Calc>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CCalc>,
public IDispatchImpl<ICalc, &IID_ICalc, &LIBID_CALCTESTLib>,
public CProxy_ICalcEvents< CCalc >,
public IProvideClassInfo2Impl< &CLSID_Calc, NULL, &LIBID_CALCTESTLib >
{
public:
CCalc()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_CALC)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCalc)
COM_INTERFACE_ENTRY(ICalc)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CCalc)
CONNECTION_POINT_ENTRY(DIID__ICalcEvents)
END_CONNECTION_POINT_MAP()
.....
HRESULT Fire_OnResult(INT nEle1, INT nEle2)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[2];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[1] = nEle1;
pvars[0] = nEle2;
DISPPARAMS disp = { pvars, NULL, 2, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
};
但是变量 "nConnections" 跟踪得到的值是零????!!!!
...全文
相关推荐
JavaScript+OCX+COM组件,实现网页对客户端DLL的调用
JavaScript+OCX+COM组件,实现网页对客户端DLL的调用
C++创建COM组件及其跨语言调用范例
在现代软件开发中,组件对象模型(Component Object Model,简称COM)是一种软件组件的二进制接口标准,它允许软件组件通过一个共同的接口相互沟通。作为微软的一个基础架构,COM在Windows操作系统上广泛应用于多种编程语言之间,提供了语言无关性,被广泛用于Windows系统程序设计中,使得不同语言编写的程序能够互相协作。COM接口是通过虚拟函数表(virtual function table,V-table)实现的,它规定了组件如何与外界进行交互,如何被其他组件或者客户端调用。
查看com组件工具 comview
查看windows系统com组件dll类、ocx类文件的工具comview,一个很好的工具。
c++创建com组件,并且提供c#,c++,网页js等调用例子。
c++创建com组件,并且提供c#,c++,网页js等调用例子。
html调用com组件ocx,ocx回调html
编写了一个com组件,regvr32注册组件后可供html调用,编写了一个回调函数调用html中的方法,返回计算中的时时状态。有回调函数讲解文档及html调用demo。


