cef中js与C++交互

这篇博客详细介绍了如何在CEF(Chromium Embedded Framework)中实现JavaScript与C++的交互,主要通过cefquery方式进行通信。文章涵盖了前端的使用方法,以及在CEF端的处理步骤,包括在OnWebKitInitialized或OnContextCreated事件中注册函数,JS端的调用,CEF的响应处理,浏览器和渲染进程的消息处理,以及回调的具体调用流程。

cefquery方式交互

前端使用

window.cefQuery({
        request: 'checkProductID', 请求名作为标识
        persistent: false,
        onSuccess: this.checkLicenseSucess,
        onFailure: this.checkLicenseFailure
      });

cef端处理:OnQuery

 if (message_name == kMessageCheckLicense) {
        MainContext::Get()->GetLicenseCheckHandler()->checkProduct(callback);
    }
// 具体handler执行并返回结果数据 其中callback包含成功失败回调
class Callback : public CefBaseRefCounted {
   public:
    virtual void Success(const CefString& response) = 0;
    virtual void Failure(int error_code, const CefString& error_message) = 0;
  };

cef注册函数:

注册全局变量只需1.2步即可即注册使用

1、OnWebKitInitialized 或 OnContextCreated 中初始化时进行函数注册

   // 设置函数名并设置执行handler    
   CefRefPtr<CefV8Value> func_max = CefV8Value::CreateFunction("checkNormDBRegister", m_handler);    
   object->SetValue("checkNormDBRegister", func_max, V8_PROPERTY_ATTRIBUTE_NONE);   

2、js端调用

window.checkNormDBRegister

3、cef响应处理

   /// CefV8Handlerimpl.execute 根据名称确认函数 并发送给浏览器处理  
    if (name == "checkNormDBRegister")
    {
        if (arguments.size() == 3 && arguments[1]->IsFunction() && arguments[2]->IsFunction())
        {
            CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create("checkNormDBRegister");
            // 构造参数
            CefRefPtr<CefListValue> args = msg->GetArgumentList();
            CefRefPtr<CefV8Value> value = arguments[0];
            m_callback_regis_normdb_sucess = arguments[1];
            m_callback_regis_normdb_fail = arguments[2];
            m_context = CefV8Context::GetCurrentContext();
            args->SetString(0, value->GetStringValue());    
            // 发送给浏览器进程
            auto browser = CefV8Context::GetCurrentContext()->GetBrowser();
            browser->SendProcessMessage(PID_BROWSER, msg);
            return true;
        }
    }

4、浏览器收到消息处理

// ClientHandler::OnProcessMessageReceived  处理后返回结果发送给render进程
if (message_name == "checkNormDBRegister")
{
  CefRefPtr<CefListValue> args = message->GetArgumentList();
  CefString record = args->GetString(0);
  std::string sAllDBIDs = record.ToString();
  std::string sRegistered;          
  if (MainContext::Get()->GetGLDLicenseCheckHandler()->checkNormDBValid(sAllDBIDs, sRegistered) ) {
      //发送进程消息到渲染进程,渲染进程收到后将调用回调函数回执给web
      CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create("checkNormDBRegister");
      // 构造参数
      CefRefPtr<CefListValue> args_ = msg->GetArgumentList();
      CefString sDBIDs(sRegistered);
      args_->SetString(0, sDBIDs);
      // 发送给渲染进程          
      browser->SendProcessMessage(PID_RENDERER, msg);
  }
}

5、渲染进程收到处理结果进行回调处理

// ClientAppRenderer::OnProcessMessageReceived 调用之前的m_handler记录js回调进行结果返回
if (message_name == "checkNormDBRegister")
    {
      CefRefPtr<CefListValue> args = message->GetArgumentList();
      CefString record = args->GetString(0);          
      if (record.empty())
      {
          m_handler->executeNormDb_CallBack_Fail();
      }
      else
      {
          m_handler->executeNormDb_CallBack_Sucess(record);
      }    
}

6.回调具体调用

void executeNormDb_CallBack_Sucess(const CefString& data)
{
    // 进入上下文
    m_context->Enter();

    // 构造参数
    CefV8ValueList args;
    args.push_back(CefV8Value::CreateString(data));

    // 执行回调
    m_callback_regis_normdb_sucess->ExecuteFunction(NULL, args);            

    // 退出上下文
    m_context->Exit();            
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值