1.IE 插件
1) 自己定义个CComDispatchDriver 变量保存页面传过来的JS函数:
CComDispatchDriver m_SaveJSFun;
2) 增加插件接口,供页面调用,设置回调函数给插件
VOID SetJSCallbackFun(IDispatch* bstrTst)
{
m_SaveJSFun = bstrTst;
}
3)js回调(js函数需要一个字符串的参数)
VOID CallJSFun()
{
// 构造参数
VARIANT varArg[1];
varArg[0].vt =VT_BSTR;
varArg[0].bstrVal =SysAllocString(L"test");
// 执行回调
m_SaveJSFun.InvokeN((DISPID)DISPID_VALUE, varArg, 1);
}
// web页面脚本
//其实IDispatch* 是一个供IE回调的函数指针。所以在js中要用一个自定义的函数填充这个结构;
//js 代码
function calltest(ret)
{
alert("COM test 回调:" + ret);
}
function TestInvoke()
{
myActiveX.SetJSCallbackFun(calltest);
}
t>
2.npapi 插件
通过 hasProperty,setProperty 判断js 进来的函数,最后通过NPN_InvokeDefault进行回调结果给js;
NPIdentifier NpTst;
NPObject *ptest;
//构造的时候注册这个函数
NpTst= NPN_GetStringIdentifier("nptestcallback");
bool hasProperty(NPIdentifier propertyName)
{
if((NpTst==propertyName))
{
return true;
}
return false;
}
bool setProperty(NPIdentifier name,const NPVariant *value)
{
if(name == NpTst)
{
if(!ptest)
{
//返回结果通知
ptest=(CObject *)NPN_RetainObject(NPVARIANT_TO_OBJECT(*value));
}
}
return true;
}
//回调js的代码
void test()
{
if(!ptest)
{
TRACE("ptest回调函数失败\r\n");
}
NPVariant result;
NPVariant relements[1];
USES_CONVERSION;
STRINGN_TO_NPVARIANT("test ret value",1024,relements[0]);
NPN_InvokeDefault(m_npp, ptest, relements, 1, &result);
NPN_ReleaseVariantValue(&result);
NPN_ReleaseObject(ptest);
ptest = NULL;
}
//js 代码