Cef

CEFのブラウザプロセスとレンダリングプロセス間の通信



Communication Between Browser Process



https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage CEFが提供するブラウザとブラウザ間の通信のメカニズムについていくつか触れました。プロセスランタイムメッセージを試し、CefProcessMessageとCefBrowser :: SendProcessMessage()を使用しました。

にいる JSはCEFでC ++と相互作用します 基本的な手順を説明しながら、テキストに基づいてキーコードを示します。



Foruokオリジナル、転載が必要な場合は、foruokのWeChatサブスクリプション番号「ProgramVision」の連絡先foruokに注意してください。

    1. メッセージを送ります

CefBrowser :: SendProcessMessage()を使用してメッセージを送信します。 SendProcessMessageの最初のパラメーターはCefProcessIdであり、ブラウザープロセスに送信されます。 PID_BROWSERを使用してレンダリングプロセスに送信され、PID_RENDERERが使用されます。



レンダリングプロセスでメッセージを送信したコードは次のとおりです(ClientV8HandlerのExecuteメソッド内)。

CefRefPtr msg = CefProcessMessage::Create('login_msg') // Retrieve the argument list object. CefRefPtr args = msg->GetArgumentList() // Populate the argument values. args->SetSize(2) args->SetString(0, strUser) args->SetString(1, strPassword) // Send the process message to the browser process. CefV8Context::GetCurrentContext()->GetBrowser()->SendProcessMessage(PID_BROWSER, msg)

cef_js_integrationの例で受信したログインメッセージ(レンダリングプロセス)をブラウザプロセスに送信しました。

    1. メッセージの処理

ブラウザ側で、CefClient :: OnProcessMessageReceived()メソッドをオーバーライドして、クロスプロセスメッセージを処理します。



cef_js_integrationを例にとると、OnProcessMessageReceivedメソッドはClientHandlerでオーバーライドされます。

bool ClientHandler::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message){ const std::string& messageName = message->GetName() if (messageName == 'login_msg') { // extract message CefRefPtr args = message->GetArgumentList() CefString strUser = args->GetString(0) CefString strPassword = args->GetString(1) TCHAR szLog[256] = { 0 } _stprintf_s(szLog, 256, _T('BrowserProcess, user - %s, password - %s '), strUser.c_str(), strPassword.c_str()) OutputDebugString(szLog) //send reply to render process CefRefPtr outMsg = CefProcessMessage::Create('login_reply') // Retrieve the argument list object. CefRefPtr replyArgs = outMsg->GetArgumentList() // Populate the argument values. replyArgs->SetSize(1) replyArgs->SetInt(0, 0) // Send the process message to the renderer process. browser->SendProcessMessage(PID_RENDERER, outMsg) return true } return false}

ご覧のとおり、上記のコードはレンダリングプロセスにメッセージを送信します。

レンダリングプロセス側で、CefRenderProcessHandler :: OnProcessMessageReceived()メソッドをオーバーライドして、ブラウザープロセスからのメッセージを処理します。特定のコードはClientAppRenderクラスにあります。

bool ClientAppRenderer::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message){ const std::string& messageName = message->GetName() if (messageName == 'login_reply') { // extract message CefRefPtr args = message->GetArgumentList() int status = args->GetInt(0) OutputDebugString(status == 0 ? _T('Renderer process, login ok ') : _T('Renderer process, login failed ')) CefRefPtr frame = browser->GetMainFrame() frame->ExecuteJavaScript('alert('Got Login Reply from Browser process')', frame->GetURL(), 0) return true } return false}

わかりました、これがプロセス全体です。

その他の参考記事:

次に、私の先生である神の人工知能チュートリアルを共有します。ゼロベース!わかりやすい!ユーモラス!黄色の段落も!私たちの人工知能チームにもぜひご参加ください。 https://blog.csdn.net/jiangjunshow