关于cef:cef-进程间通信

34次阅读

共计 1859 个字符,预计需要花费 5 分钟才能阅读完成。

因为 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);

正文完
 0