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