1、添加事件
在类视图中的XXXlib下面的_ICaleEvents中添加方法,带有钥匙标记的那个项(xxx为项目名,不要在类视图的根目录下找),根据需要选择有无参数、有无返回值,其中的参数是返回值,参数类型都是指针
在添加的控件类中,右击选择 添加连接点 ,注意选项,添加 _ICaleEvents后确定
控件的单击事件。首先添加windows消息处理函数,选择控件->属性 OnLButtonDown,点击。
在此函数中调用先前添加的方法即可。
//实现异步计算方式,并非真的异步。真异步需要采用多线程编程
STDMETHODIMP CCale::AddAsync(DOUBLE a, DOUBLE b)
{
double result;
result = a + b;
Fire_AddCompleted(&result);//调用添加的事件。
return S_OK;
}
LRESULT CCale::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
Fire_mclick();//自定义的事件。当单击时,会触发此事件,在js中可监听此事件,然后进行编码
return 0;
}
2、测试
在js中测试
<script type="text/javascript">
function addAsync() {
//调用有返回值的事件,增加事件监听的方式。这个事件是在AddAsync()方法中触发的事件。
Cale.attachEvent("AddCompleted", OnAddCompleted);
Cale.AddAsync(33, 4);
}
function OnAddCompleted(result) {
alert(result);
}
function call(a, b) {
alert(a + b);
}
</script>
<!--调用无返回值的事件,单击控件时触发-->
<SCRIPT type="text/javascript" FOR="Cale" EVENT="mclick()" >
call(1,2)
</SCRIPT>
==========================================================
js调用ActiveX中的方法,然后再ActiveX的被调用的方法中调用js中的方法
STDMETHODIMP CAJCom::CallWebJs(VARIANT scriptCallback)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加实现代码
CComPtr<IDispatch> spCallback;
if (scriptCallback.vt == VT_DISPATCH)
spCallback = scriptCallback.pdispVal;
CComVariant avarParams[1];
avarParams[0] = "hhheeee"; //指定回调函数的参数
DISPPARAMS params = { avarParams, NULL, 1, 0 };
if(spCallback)
spCallback->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
return S_OK;
}
js测试
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>对象 AJCom 的 ATL 8.0 测试页</TITLE>
</HEAD>
<BODY>
<OBJECT ID="AJCom" CLASSID="CLSID:C81FBB52-8890-4E99-9F54-F64BA14C015B"></OBJECT>
<INPUT TYPE="Button" NAME="btnAddMode3" VALUE="开启捕捉3" οnclick="test()">
<script type="text/javascript" language="JavaScript">
//------------------------------------------------
function test() {
var result = AJCom.CallWebJs(printMsg);
}
function printMsg(msg) {
alert(msg);
}
</script>
</BODY>
</HTML>
测试没问题
========================================
在多线程中ActiveX和JS交互请参照,是上述第二种方式的扩展
http://blog.csdn.net/chenscmail/article/details/8670985