关于NPAPI开发过程中的几点问题

1 篇文章 0 订阅

1、函数回调,C++主动调用JS

前端:

<embed id="objinput" type="application/safeinput" width="300" height="50">

function enter(){

      alert("enter");

}

embed1=document.getElementById('objinput');

embed1.OnEnter=enter;

后端验证

bool ScriptablePluginObject::HasProperty(NPIdentifier name)
{	
     return (name ==s_idOnEnter);//通过属性传递过来的回调函数,
}
//在获得这个属性时,一定要调用NPN_RetainObject保存起来。这里的属性就是JS的函数指针
 
bool ScriptablePluginObject::SetProperty(NPIdentifier name, const NPVariant *value)
{
	 if(name == s_idOnEnter){
		if(!m_pJsCallBackObj)
		{
			m_pJsCallBackObj=NPN_RetainObject(NPVARIANT_TO_OBJECT(*value));
		}	//NPN_ReleaseObject(m_pJsCallBackObj);
	  }
    
	return true; 

}

保存完成后就可以在需要时调用这个JS了
    
if(!m_pJsCallBackObj)
	MessageBox(NULL,"回调函数不正确!","title",0);

	NPVariant result;
	NPN_InvokeDefault(mNpp,m_pJsCallBackObj,NULL,0,&result);
	NPN_ReleaseVariantValue(&result);



最后还有一个重要的一点:就是一定要在ScriptablePluginObjectBase::_Deallocate(NPObject *npobj)方法中释放回调接口,否则刷新页面时就会崩溃
if(m_pJsCallBackObj)
{
   NPN_ReleaseObject(m_pJsCallBackObj);
   m_pJsCallBackObj=NULL;
}

关于ScriptablePluginObjectBase::_Deallocate,实际上就是NPClass的一个成员回调函数:
#define DECLARE_NPOBJECT_CLASS_WITH_BASE(_class, ctor)                        \
static NPClass s##_class##_NPClass = {                                        \
  NP_CLASS_STRUCT_VERSION_CTOR,                                               \
  ctor,                                                                       \
  ScriptablePluginObjectBase::_Deallocate,                                    \
  ScriptablePluginObjectBase::_Invalidate,                                    \
  ScriptablePluginObjectBase::_HasMethod,                                     \
  ScriptablePluginObjectBase::_Invoke,                                        \
  ScriptablePluginObjectBase::_InvokeDefault,                                 \
  ScriptablePluginObjectBase::_HasProperty,                                   \
  ScriptablePluginObjectBase::_GetProperty,                                   \
  ScriptablePluginObjectBase::_SetProperty,                                   \
  ScriptablePluginObjectBase::_RemoveProperty,                                \
  ScriptablePluginObjectBase::_Enumerate,                                     \
  ScriptablePluginObjectBase::_Construct                                      \
};







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值