作者:我很丑但我可以很温柔 | 来源:互联网 | 2023-05-19 00:08
有一个普通的自动化的组件(非ActiveX),实现了以下接口structIMath:publicIDispatch{virtualHRESULT__stdcallAd
有一个普通的自动化的组件(非ActiveX),实现了以下接口
struct IMath:public IDispatch
{
virtual HRESULT __stdcall Add( ULONG a, ULONG b, ULONG* pret ) = 0;
virtual HRESULT __stdcall Sub( ULONG a, ULONG b, ULONG* pret ) = 0;
};
同时组件定义了一个双接口作为出接口如下
struct IMathEvent:public IDispatch
{
virtual HRESULT __stdcall onTooLarge( ULONG r ) = 0;
};
当IMath::Add或IMath::Sub方法的结果大于5时,组件就会通过客户端实现的IDispath接口来调用客户的onTooLarge函数.
使用C++测试没有问题.但是在Javascript和Vbscript都不能正常响应该事件,跟到组件的代码里,发现是IMathEvent出接口的连接点没有被连接.
C++中是使用Advise显示连接的事件连接点.但是在Javascript和Vbscript里,应该怎么样Advise呢?以下是我的脚本测试代码,请各位帮我看看有什么问题
/////Javascript的测试代码
//////Vbscript测试代码
我在网上查了很多例子,它们的事件响应都是这么写的,为什么我这样写就不行呢?是不是普通的COM(非ActiveX)根本就不能使用脚本客户端的出接口呢?
请大家帮忙看看啊
5 个解决方案
这一句里的 "for 那个引号是我编辑文章时无意弄上去的,代码里本来没有.
估计你的组件没有实现IProvideClassInfo2接口,加上下面几行 (把CLSID, DIID, LIBID改为你的组件的数据)
public IProvideClassInfo2Impl<&CLSID_Math,&DIID__IMathEvents, &LIBID_MATHEVENTLib>,
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
masterz,你说得完全正确哦.不过我不是用MFC写的,是COM API写的