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