1.在js中调用一个Com组件;
由于使用了ActiveXObject,因此只能在IE浏览器下使用;
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
<title>加法计算</title>
-
<script language="javascript" type="text/javascript">
-
// <![CDATA[
-
-
function add_onclick()
-
{
-
var atlCom=new ActiveXObject("FirstComB.MyMath.1");//创建com对象
-
var num1 =document.getElementById("Text1").value; // 获取第一个数
-
var num2 =document.getElementById("Text2").value; // 获取第二个数
-
var Result= 0;
-
Result = atlCom.Add(num1,num2);
-
alert(Result);
-
-
}
-
-
// ]]>
-
-
</script>
-
-
</head>
-
<body >
-
<p> 输入数一:<input id="Text1" type="text" /></p>
-
<p> 输入数二:<input id="Text2" type="text" /></p>
-
<p> <input id="Button4" type="button" value="相加" onclick="return add_onclick()" /></p>
-
</body>
-
</html>
2.COM 调用JS的方法:
此方法参考网上的资料,实现com回调js中的函数
JS中代码:
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
<title>xxxx</title>
-
<script language="javascript" type="text/javascript">
-
// <![CDATA[
-
//回调函数
-
function printMsg(msg1, msg2, msg3)
-
{
-
alert(msg1);
-
alert(msg2);
-
alert(msg3);
-
-
}
-
-
function add_onclick()
-
{
-
var obj=new ActiveXObject("TEST.MyTest.1");//创建com对象
-
//在Com中注册回掉函数
-
obj.SetJsCallbackFunc(printMsg);
-
//显示结果
-
obj.Print();
-
}
-
-
// ]]>
-
-
</script>
-
</head>
-
<body>
-
<p> <input id="Button4" type="button" value="相加" onclick="return add_onclick()" /></p>
-
-
</body>
-
</html>
COM中:
Com组件中定义函数接口,以便将JS中定义的函数作为参数传递给Com组件
头文件中定义IDispatch接口:
[cpp]
static CComPtr
m_spCallback;
[cpp]
STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加实现代码
if (scriptCallback.vt == VT_DISPATCH)
{
m_spCallback = scriptCallback.pdispVal;
}
return S_OK;
}
Com组件中调用JS函数:
[cpp]
void CJSCallBack::CallJsFunction()
{
CComVariant avarParams[5];
avarParams[0] = “AAA”; //指定回调函数的参数
avarParams[1] = "BBB";
avarParams[2] = "CCC";
avarParams[3] = "DDD";
avarParams[4] = "EEE";
DISPPARAMS params = { avarParams, NULL, 5, 0 };
if(m_spCallback)
{
HRESULT hr = m_spCallback->Invoke(0,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
¶ms, NULL, NULL, NULL);
}
}
几点注意的地方:
1,DISPPARAMS params = { avarParams, NULL, 5, 0 },中的第三个参数将决定要传递到JS函数中的参数的个数
2,在JS函数中参数的顺序与Com组件中赋值的顺序是反的,根据本例代码,参数数组中第一个是"AAA",最后一个是"EEE",但是实际在JS代码中,msg1的值是"EEE",msg5的值是"AAA"
调用过程:
[javascript]
obj.Print("AAA",0);
[cpp] view plaincopy
STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CallJsFunction();
return S_OK;
}
阅读(964) | 评论(0) | 转发(0) |