关于cef:cef-进程间通信

因为CEF3运行在多过程环境下,所以须要提供一个过程间通信机制。CefBrowser和CefFrame对象在Borwser和Render过程里都有代理对象。CefBrowser和CefFrame对象都有一个惟一ID值绑定,便于在两个过程间定位匹配的代理对象。

解决启动音讯

为了给所有的Render过程提供一样的启动信息
在Browser过程实现CefBrowserProcessHander::OnRenderProcessThreadCreated()办法。在这里传入的信息会在Render过程的CefRenderProcessHandler::OnRenderThreadCreated()办法里承受。

解决运行时音讯

在过程申明周期内,任何时候你都能够通过CefProcessMessage类传递过程间音讯。这些信息和特定的CefBrowser实例绑定在一起,用户能够通过CefBrowser::SendProcessMessage()办法发送。过程间音讯能够蕴含任意的状态信息,用户能够通过CefProcessMessage::GetArgumentList()获取

// Create the message object.
CefRefPtr<CefProcessMessage> msg= CefProcessMessage::Create(“my_message”);

// Retrieve the argument list object.
CefRefPtr<CefListValue> args = msg>GetArgumentList();

// Populate the argument values.
args->SetString(0, “my string”);
args->SetInt(0, 10);

一个从Browser过程发送到Render过程的音讯将会在CefRenderProcessHandler::OnProcessMessageReceived()办法里被接管。一个从Render过程发送到Browser过程的音讯将会在CefClient::OnProcessMessageReceived()办法里被接管

bool MyHandler::OnProcessMessageReceived(
    CefRefPtr<CefBrowser> browser,
    CefProcessId source_process,
    CefRefPtr<CefProcessMessage> message) {
  // Check the message name.
  const std::string& message_name = message->GetName();
  if (message_name == “my_message”) {
    // Handle the message here...
    return true;
  }
  return false;
}

咱们能够调用CefFrame::GerIdentifier()获取CefFrame的ID,并通过过程间音讯发送给另一个过程,而后在接收端通过CefBrowser::GetFrame()找到对应的CefFrame。通过这种形式能够将过程间音讯和特定的CefFrame分割在一起

// Helper macros for splitting and combining the int64 frame ID value.
#define MAKE_INT64(int_low, int_high) \
    ((int64) (((int) (int_low)) | ((int64) ((int) (int_high))) << 32))
#define LOW_INT(int64_val) ((int) (int64_val))
#define HIGH_INT(int64_val) ((int) (((int64) (int64_val) >> 32) & 0xFFFFFFFFL))

// Sending the frame ID.
const int64 frame_id = frame->GetIdentifier();
args->SetInt(0, LOW_INT(frame_id));
args->SetInt(1, HIGH_INT(frame_id));

// Receiving the frame ID.
const int64 frame_id = MAKE_INT64(args->GetInt(0), args->GetInt(1));
CefRefPtr<CefFrame> frame = browser->GetFrame(frame_id);

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理